如何使用usingColumns

时间:2018-08-25 01:40:51

标签: apache-spark join apache-spark-sql

我想加入2个数据框。

DF1:

root
 |-- myStruct: struct (nullable = true)
 |    |-- id: string (nullable = true)
 |    |-- region: long (nullable = true)
 |-- first_name: string (nullable = true)

DF2:

root
 |-- id: string (nullable = true)
 |-- region: long (nullable = true)
 |-- second_name: string (nullable = true)

我的加入声明是

df1.join(df2, Seq("id", "region"), "leftouter")

但是以

失败
USING column `id` cannot be resolved on the left side of the join. The left-side columns: myStruct, first_name

我正在Scala上运行Spark 2.2

2 个答案:

答案 0 :(得分:2)

您可以使用.表示法从struct列中选择一个元素。因此要从 df1 中选择id,您将必须执行myStruct.id,而要选择region,则必须使用myStruct.region

由于要使用的列名不同,您可以使用===表示法进行比较

df1.join(df2, df1("myStruct.id") === df2("id") && df1("myStruct.region") === df2("region"), "leftouter")

您应该将连接的 dataframe 与以下 schema

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)

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

我希望答案会有所帮助

答案 1 :(得分:0)

这是因为在DF1中,id是列myStruct的元素,其类型为struct。要加入,您可以做类似的事情,

val df = df1
.withColumn("id", col("myStruct.id"))
.withColumn("region", col("myStruct.region"))

df.join(df2, Seq("id", "region"), "leftouter")

这实际上是从struct列中提取idregion