我有两个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.Index
与df2.Index
不同,containNull
不同。
那我怎么能弄清楚这个问题呢?
我还想了解df2架构中|-- element: integer (containsNull = true)
的原因。
非常感谢!
答案 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]|
+-----+------+------+------+