与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"))
希望我完全错了,并且有更有效的方法来做到这一点;)
答案 0 :(得分:0)
我认为你拥有的是一个具有良好可读性的简洁解决方案。如果需要,您可以使用RDD探索另一种方法。假设您的列列表不大,您可以collect
将列列表set
colx
并df1
映射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