我有两个数据集要连接df
|-- key: struct (nullable = false)
| |-- name: string (nullable = true)
| |-- subId: struct (nullable = true)
| | |-- x: integer (nullable = false)
| | |-- y: integer (nullable = false)
| | |-- level: integer (nullable = false)
|-- otherItems: struct (nullable = false)
| |-- nameRestaurant: string (nullable = true)
| |-- thing: struct (nullable = true)
和另一个df2
|-- key: struct (nullable = false)
| |-- name: string (nullable = true)
| |-- subId: struct (nullable = true)
| | |-- x: integer (nullable = false)
| | |-- y: integer (nullable = false)
| | |-- level: integer (nullable = false)
|-- attribute: struct (nullable = false)
| |-- address: string (nullable = true)
| |-- someThing: struct (nullable = true)
我需要在key
列上连接两个数据集,即val df3 = df.join(df2, Seq("key"), "left")
然而,执行该连接会导致没有匹配,而我确信它们存在
当我尝试通过执行以下操作扩展联接时
val df3 = df.join(df2, Seq("key.name", "key.subId.x", "key.subId.y", "key.subId.level"), "left")
我收到错误
org.apache.spark.sql.AnalysisException: USING column `key.name` cannot be resolved on the left side of the join.
在结构体下面的项上加入是不可能的吗?有人能建议最好的方法吗?
1条答案
按热度按时间z0qdvdin1#
在spark3.3.1中,这是可以的!但是在spark2.X版本中,您可以使用以下解决方案:
1.在
key
转换为string的每个df上创建一个新列,并在该字段上使用连接操作。在连接操作之后,您可以删除该字段: