gpt4 book ai didi

scala - 如何仅将那些行(来自大表)与左小表中的键合并?

转载 作者:行者123 更新时间:2023-12-01 12:20:53 26 4
gpt4 key购买 nike

我有两个数据框,一个大,一个小:

val small_df = sc.parallelize(List(("Alice", 15), ("Bob", 20)).toDF("name", "age")

val large_df = sc.parallelize(("Bob", 40), ("SomeOne", 50) , ... ).toDF("name", "age")

我想将这两个数据框相加,但只将那些在我的小表中有键的数据框相加,也就是说,我希望我的结果如下:

List(("Alice", 15), ("Bob", 60))

我的第一次尝试是尝试unionreduceByKey,但我似乎找不到union 两个表的方法,并且将那些带有键的行仅保留在较小的行中。

有没有办法做类似“左联合”或其他方式来接近我的答案?

最佳答案

解决此问题的一种方法是进行外部联接,然后将两个结果年龄列相加。请注意,应导入 spark.implicits._ 以使用 $org.apache.spark.sql.functions.broadcast 进行广播.

如果两个数据帧中的任何一个包含重复项(在名称列中),最终数据帧也将包含重复项,这可能是您想要的也可能不是。对于 large_df 中的重复项,只有在 small_df 中有相应的名称时才会显示,如问题中所述。

作为一种优化,由于其中一个数据帧很小,因此可以在连接之前广播它以提高性能。

val small_df = sc.parallelize(List(("Alice", 15), ("Bob", 20)).toDF("name", "age")
val large_df = sc.parallelize(("Bob", 40), ("SomeOne", 50)).toDF("name", "age")

val df = large_df.withColumnRenamed("age", "large_age").join(broadcast(small_df), Array("name"), "right_outer")
val df2 = df.withColumn("age", when($"large_age".isNotNull, $"age" + $"large_age").otherwise($"age")).select("name", "age")
df2.show

+-----+----+
| name| age|
+-----+----+
|Alice|15.0|
| Bob|60.0|
+-----+----+

关于scala - 如何仅将那些行(来自大表)与左小表中的键合并?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44062445/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com