如何使用 usingColumns 连接 Spark 中的嵌套列

ale*_*lov 2 join apache-spark apache-spark-sql

我有 2 个数据框想要加入。

DF1:

root
 |-- myStruct: struct (nullable = true)
 |    |-- id: string (nullable = true)
 |    |-- region: long (nullable = true)
 |-- first_name: string (nullable = true)
Run Code Online (Sandbox Code Playgroud)

DF2:

root
 |-- id: string (nullable = true)
 |-- region: long (nullable = true)
 |-- second_name: string (nullable = true)
Run Code Online (Sandbox Code Playgroud)

我的加入声明是

df1.join(df2, Seq("id", "region"), "leftouter")
Run Code Online (Sandbox Code Playgroud)

但这失败了

USING column `id` cannot be resolved on the left side of the join. The left-side columns: myStruct, first_name
Run Code Online (Sandbox Code Playgroud)

我在 Scala 上运行 Spark 2.2

Ram*_*jan 5

您可以使用.符号从列中选择元素struct。因此,要从df1id中进行选择,您必须使用.myStruct.idregionmyStruct.region

由于要使用的列名不同,您可以使用===符号进行比较:

df1.join(df2, df1("myStruct.id") === df2("id") && df1("myStruct.region") === df2("region"), "leftouter")
Run Code Online (Sandbox Code Playgroud)

您应该拥有具有以下架构的连接数据框

root
 |-- myStruct: struct (nullable = true)
 |    |-- id: string (nullable = true)
 |    |-- region: long (nullable = false)
 |-- first_name: string (nullable = true)
 |-- id: string (nullable = true)
 |-- region: integer (nullable = true)
 |-- second_name: string (nullable = true)
Run Code Online (Sandbox Code Playgroud)

您可以在加入后删除不需要的列或在加入后仅选择需要的列

我希望答案有帮助