我正在使用Spark数据帧,并希望在Scala中使用spark-sql更新配置单元表中的列column_to_be_updated
。
到目前为止,我的代码还适用于较小的数据框:
var data_frame = spark.sql("Select ... From TableXX")
var id_list = spark.sql("Select Id From TableXY Where ...")..collect().map(_(0)).toList
data_frame.withColumn("column_to_be_updated", when($"other_column_of_frame".isin(id_list:_*), 1)
.otherwise($"column_to_be_updated"))
如果column_to_be_updated
中的条目位于other_column-of_frame
的id列中,我想要更新TableXY
列。我的解决方法是先将id列转换为列表,然后使用.isin
语句。
但是,我在TableXY
和TableXX
中有很多行,因此它似乎崩溃了并且使id_list
过载。对于我要实现的目标,是否还有其他解决方法或更有效的解决方案?
提前谢谢!
答案 0 :(得分:2)
您可以使用外部左连接来连接数据框。这样,可以将Id
列添加到data_frame
在id列表中的行上的other_column_of_frame
上。然后,只需检查新添加的Id
列是否为空。
val ids = spark.sql("Select Id From TableXY Where ...")
val updated = data_frame
.join(broadcast(ids), ids.col("Id") === data_frame.col("other_column_of_frame"), "left_outer")
.withColumn("column_to_be_updated", when($"Id".isNotNull, 1).otherwise($"column_to_be_updated"))
.drop("Id")
您可以在此处了解有关broadcast
的信息:DataFrame join optimization - Broadcast Hash Join