如何从具有Scala中许多条目的其他数据框中更新基于Column的Spark数据框?

时间:2019-05-08 08:50:24

标签: scala apache-spark dataframe hive apache-spark-sql

我正在使用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语句。

但是,我在TableXYTableXX中有很多行,因此它似乎崩溃了并且使id_list过载。对于我要实现的目标,是否还有其他解决方法或更有效的解决方案?

提前谢谢!

1 个答案:

答案 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