嗨,我有2个spark数据帧。
第一个:
+---------------+---------------+-------+--------+---------+-----------+------------+---------------+----------------+
|cluster_socio_6|cluster_socio_7|country|latitude|longitude|last_update| uid|segment_comp_11|cluster_comp_170|
+---------------+---------------+-------+--------+---------+-----------+------------+---------------+----------------+
| 2| 2| IT| 41.884| 13.5204| 2019-04-15|d@rNdBkkN-p3| 10| 3|
| 16| 15| IT| 45.5298| 9.03813| 2019-04-15|Ie2Bbs9PUR8h| 15| 4|
| 16| 15| IT| 45.5298| 9.03813| 2019-04-15|Jk2Bbs9PUR8h| 15| 4|
+---------------+---------------+-------+--------+---------+-----------+------------+---------------+----------------+
第二个:
+---------------+---------------+-------+--------+---------+-----------+------------+
|cluster_socio_6|cluster_socio_7|country|latitude|longitude|last_update| uid|
+---------------+---------------+-------+--------+---------+-----------+------------+
| 4| 17| IT| 40.8413| 14.2008| 2019-04-16|ASBuzjKa6nIB|
| 2| 2| IT| 41.884| 15.5204| 2019-04-16|d@rNdBkkN-p3|
| 16| 15| IT| 45.5298| 9.03813| 2019-04-16|Ie2Bbs9PUR8h|
| 16| 15| IT| 45.5298| 9.03813| 2019-04-15|xyzBbs9PUR8h|
+---------------+---------------+-------+--------+---------+-----------+------------+
除了国家/地区,纬度,经度,last_update和uid外,底部Df可能添加了不同的列。
这个想法是通过uid进行完全连接,更新公共列并保留不常见的列。
我该如何完成这项任务?
谢谢。
答案 0 :(得分:0)
这是代码(您没有指定,所以我们尝试Scala):
// Your dataframes
val upper = ...
val lower = ...
// Find out the columns
val sharedCols = upper.columns.toSet & lower.columns.toSet
val disjointCols = (upper.columns.toSet | lower.columns.toSet) -- sharedCols
val columns = (sharedCols.map(c => coalesce(lower.col(c), upper.col(c)).as(c)) ++ disjointCols.map(c => col(c))).toList
// Join and project
val joined = upper.join(lower, upper.col("uid") === lower.col("uid"), "full_outer").select(columns:_*)
joined.show
答案 1 :(得分:0)
如果您在评论中说过,则希望始终来自底部表格的公共列。您可以进行简单的连接,然后在连接之前从df1中丢失常见的克隆。
joined_df = df1.drop("some_common_columns").join(df2,Seq("uid"))
这将使您仅拥有来自df1的通用克隆和新joind_df中两个df罕见的合并数据
答案 2 :(得分:0)
我找到了这个解决方案,以避免由于加入而造成的拖曳。
你们呢?
我可以使用任何改进或Scala快捷方式吗?
def func_union_name(myCols: Set[String], allCols: Set[String]) = {
allCols.toList.map(x => x match {
case x if myCols.contains(x) => col(x)
case _ => lit(null).as(x)
})
}
定义上面的功能后,我会这样做:
val upper_col = tableToUpdate.columns.toSet
val bottom_col = miniJoin.columns.toSet
val union_cols = tableToUpdate_col ++ miniJoin_col
upper
.select(func_union_name(tableToUpdate_col, union_cols): _*)
.union(bottom.select(func_union_name(bottom_col, union_cols): _*))
.withColumn("max_lu",max(col("last_update"))
.over(Window.partitionBy(col("uid"))))
.filter(col("last_update").geq(col("max_lu")))
.drop(col("max_lu"))