我想加入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
答案 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列中提取id
和region
。