使用Spark替换联接功能

问题描述

我有以下数据框:

Dataframe1
+---------------+
|id_data        |
+---------------+
|[1,20,3]       |
|[5,40]         |
|[50,90]        |
|[30,70]        |
+---------------+

id_data的类型:array<integer>

Dataframe2
+---------------+
|id_data2       |
+---------------+
|20             |
|90             |
|100            |
+---------------+

我想要以下输出

 +---------------+
 |id_data2       |
 +---------------+
 |20             |
 |90             |
 +---------------+

我使用join

 Dataset <Row> result =  Dataframe2.as("data1").join( Dataframe1.as("data2"),expr("array_contains(data2.id_data,data1.id_data2)"));

我有大量数据,并且在性能方面非常繁琐。

如果没有join function使用带有Java语言的Spark,是否有可能做到这一点?

我需要你的帮助。

解决方法

您可以使用explode功能。这是一个Scala代码。

df1.withColumn("id_data1",explode($"id_data"))
  .join(df2,$"id_data1" === $"id_data2","inner")
  .select("id_data1")
  .show

+--------+
|id_data1|
+--------+
|      20|
|      90|
+--------+