如何将两个数据帧与一个数组列连接,一个元素可以为空,另一个不是

时间:2018-04-04 12:08:10

标签: dataframe spark-dataframe

我有两个dataframa df1,df2

df1
df1's Index was generated by udf function.
+------+----------+
|other |   Index  |
+------+----------+
|     5| [1, 1]   |
|     1| [0, 7]   |
|     2| [1, 7]   |
|     8| [2, 6]   |
|     6| [2, 7]   |   

|-- gridIndex: array (nullable = true)
|    |-- element: integer (containsNull = false)

df2

var l =new ListBuffer[(Int, Array[Int])]
l.append((5,Array(1,1)))
l.append((6,Array(0,7)))
l.append((1,Array(1,7)))
l.append((3,Array(2,6)))
l.append((7,Array(2,7)))

val df2 = l.toDF("other2","Index")

+------+----------+
|other2|   Index  |
+------+----------+
|     5| [1, 1]   |
|     6| [0, 7]   |
|     1| [1, 7]   |
|     3| [2, 6]   |
|     7| [2, 7]   |   

|-- gridIndex: array (nullable = true)
|    |-- element: integer (containsNull = true)

我想通过Index加入他们。 但是你可以看到出现错误:

线程中的异常" main" java.lang.IllegalArgumentException:要求失败:来自两方的连接键应具有相同的类型

df1.Indexdf2.Index不同,containNull不同。

那我怎么能弄清楚这个问题呢?

我还想了解df2架构中|-- element: integer (containsNull = true)的原因。

非常感谢!

1 个答案:

答案 0 :(得分:0)

我能够做到这一点。 由于您尚未发布预期的输出,因此不确定这是否是所需的结果。

val df1 = Seq(
            (5,Array(1,1)),
            (1,Array(0,7)),
            (2,Array(1,7)),
            (8,Array(2,6)),
            (6,Array(2,7)),
            (100,Array(null.asInstanceOf[Int],null.asInstanceOf[Int]))
            ).toDF("Other","Index")

val df2 = Seq(
            (5,Array(1,1)),
            (6,Array(0,7)),
            (1,Array(1,7)),
            (3,Array(2,6)),
            (7,Array(null.asInstanceOf[Int],null.asInstanceOf[Int]))
            ).toDF("Other2","Index")

root
 |-- Other: integer (nullable = false)
 |-- Index: array (nullable = true)
 |    |-- element: integer (containsNull = false)

root
 |-- Other2: integer (nullable = false)
 |-- Index: array (nullable = true)
 |    |-- element: integer (containsNull = false)           

df1.join(df2, df1("Index") <=> df2("Index") ).show() 

+-----+------+------+------+
|Other| Index|Other2| Index|
+-----+------+------+------+
|    5|[1, 1]|     5|[1, 1]|
|    1|[0, 7]|     6|[0, 7]|
|    2|[1, 7]|     1|[1, 7]|
|    8|[2, 6]|     3|[2, 6]|
|  100|[0, 0]|     7|[0, 0]|
+-----+------+------+------+