Spark中的Spark更新列值

时间:2017-08-17 16:04:40

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

与Spark的数据帧最相同的是什么

update table1 set colx = "some value" where coly in (select coltab2 from table2 where [another condition)]

我有一些有效的解决方案,但我对此并不是很满意。看起来真的很麻烦,我希望我能错过一种简单的方式

首先我得到了where子句的值(可能有数千个,所以我没有使用集合的魔杖)

val df2 = xxxx.select("coltab2")
df2: org.apache.spark.sql.DataFrame = [coltab2: string]

此数据框包含我想在where子句

中保留的所有值

然后我使用table1执行左外连接以在df2.coltab2=df1.coly上添加coltab2。如果添加的coltab2的值不为null,则表示它存在于table2中,因此我使用此条件从原始table1(df1)更新另一列,然后删除此添加的列coltab2,该列仅用作更新另一列的条件< / p>

val df_updated = df1.join(df2, df1("coly") === df2("coltab2"), "left_outer").withColumn("colx", when(!isnull($"coltab2"), "some value").otherwise(col("colx"))).drop(col("coltab2"))

希望我完全错了,并且有更有效的方法来做到这一点;)

1 个答案:

答案 0 :(得分:0)

我认为你拥有的是一个具有良好可读性的简洁解决方案。如果需要,您可以使用RDD探索另一种方法。假设您的列列表不大,您可以collect将列列表set colxdf1映射val df1 = Seq( ("x1", "y1"), ("x2", "y2"), ("x3", "y3") ).toDF("colx", "coly") val df2 = Seq( ("y1"), ("y3"), ("y5") ).toDF("coltab2") import org.apache.spark.sql.Row val colList: Set[String] = df2.rdd.map{ case Row(c: String) => c }.collect.toSet val dfUpdated = df1.rdd.map{ case Row(x: String, y: String) => (if (colList contains y) "some value" else x, y) }.toDF("colx", "coly") dfUpdated.show +----------+----+ | colx|coly| +----------+----+ |some value| y1| | x2| y2| |some value| y3| +----------+----+ ,如下所示:

0.47.1