2017-01-11 3 views
2

У меня есть два dataframes с двумя колоннамиSpark: Регистрация столбец dataframe с массивом

df1 со схемой (ключ1: Long, Value)

df2 со схемой (key2: Array [Long], Value)

Мне нужно присоединиться к этим кадрам данных в ключевом столбце (найти совпадающие значения между ключом1 и значениями в ключе2). Но проблема в том, что у них нет того же типа. Есть ли способ сделать это?

+0

ключ2 из df2 должен содержать ключ2 от df1? –

+0

один способ, как взорвать массив [long], а затем выполнить соединение с файловой рамкой df1 –

ответ

0

Вы можете бросить того типа ключом1 и key2, а затем использовать содержит функцию, как следует.

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| 
+----+---------+------+---------+