Заменить функцию объединения с помощью Spark

#java #apache-spark #join

#java #apache-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 использования Spark с языком Java?

Мне нужна ваша помощь.

Комментарии:

1. объединение необходимо, но вы можете explode выполнить первое.

2. Я провел некоторое исследование и обнаружил, что могу считывать значения Dataframe 1 как строковые переменные.

3. вот так : for(Iterator<Row> iter = dataframee.toLocalIterator(); iter.hasNext();) { String item = (iter.next()).get(0).toString(); } и делать это : select *from Dataframe2 where id_data2 = item

Ответ №1:

Вы можете использовать explode функцию. Это код Scala.

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

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