【问题标题】:Spark: Join dataframe column with an arraySpark:将数据框列与数组连接
【发布时间】:2020-05-08 07:34:20
【问题描述】:

我有两个包含两列的 DataFrame

  • df1 与架构 (key1:Long, Value)

  • df2 与架构 (key2:Array[Long], Value)

我需要在键列上加入这些 DataFrame(在 key1key2 中的值之间查找匹配值)。但问题是它们的类型不同。有没有办法做到这一点?

【问题讨论】:

  • df2 中的 key2 必须包含 df1 中的 key2?
  • 一种方法是爆炸 Array[long] 然后使用 df1 数据框进行连接

标签: join apache-spark


【解决方案1】:

最好的方法是使用array_contains spark sql 表达式(并且不需要对数据帧进行任何转换或分解)。

import org.apache.spark.sql.functions.expr
import spark.implicits._

val df1 = Seq((1L,"one.df1"), (2L,"two.df1"),(3L,"three.df1")).toDF("key1","Value")

val df2 = Seq((Array(1L,1L),"one.df2"), (Array(2L,2L),"two.df2"), (Array(3L,3L),"three.df2")).toDF("key2","Value")

val joinedRDD = df1.join(df2, expr("array_contains(key2, key1)")).show

+----+---------+------+---------+
|key1|    Value|  key2|    Value|
+----+---------+------+---------+
|   1|  one.df1|[1, 1]|  one.df2|
|   2|  two.df1|[2, 2]|  two.df2|
|   3|three.df1|[3, 3]|three.df2|
+----+---------+------+---------+

请注意,您不能直接使用 org.apache.spark.sql.functions.array_contains 函数,因为它要求第二个参数是文字而不是列表达式。

【讨论】:

  • 谢谢。该代码在 pyspark 中工作。但是import spark.implicits._ 的目的是什么?我在pyspark 中找不到这个模块
  • import spark.implicits._ 在 SCALA 中使用,在 PySpark 中不需要
【解决方案2】:

您可以cast key1 和key2 的类型,然后使用contains 函数,如下所示。

val df1 = sc.parallelize(Seq((1L,"one.df1"), 
                             (2L,"two.df1"),      
                             (3L,"three.df1"))).toDF("key1","Value")  

DF1:
+----+---------+
|key1|Value    |
+----+---------+
|1   |one.df1  |
|2   |two.df1  |
|3   |three.df1|
+----+---------+

val df2 = sc.parallelize(Seq((Array(1L,1L),"one.df2"),
                             (Array(2L,2L),"two.df2"),
                             (Array(3L,3L),"three.df2"))).toDF("key2","Value")
DF2:
+------+---------+
|key2  |Value    |
+------+---------+
|[1, 1]|one.df2  |
|[2, 2]|two.df2  |
|[3, 3]|three.df2|
+------+---------+

val joinedRDD = df1.join(df2, col("key2").cast("string").contains(col("key1").cast("string")))

JOIN:
+----+---------+------+---------+
|key1|Value    |key2  |Value    |
+----+---------+------+---------+
|1   |one.df1  |[1, 1]|one.df2  |
|2   |two.df1  |[2, 2]|two.df2  |
|3   |three.df1|[3, 3]|three.df2|
+----+---------+------+---------+

【讨论】:

  • 字符串“123”包含字符串“23”、“12”、“1”等。转换为字符串将加入不应加入的事物。
猜你喜欢
  • 2019-03-13
  • 2015-11-16
  • 2016-09-19
  • 2022-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 2016-08-13
相关资源
最近更新 更多