错误:只能对具有兼容列类型的表执行联合。**struct(tier:string,skyward_number:string,skyward_points:string)<> struct(skyward_number:string,tier:string,skyward_points:string)**在第二表的第一列;;
这里结构体字段的顺序是不同的,但其余的都是相同的。
dataframe 1架构
root
|-- emcg_uuid: string (nullable = true)
|-- name: string (nullable = true)
|-- phone_no: string (nullable = true)
|-- dob: string (nullable = true)
|-- country: string (nullable = true)
|-- travel_type: string (nullable = true)
|-- gdpr_restricted_flg: string (nullable = false)
|-- gdpr_reason_code: string (nullable = false)
|-- document: map (nullable = true)
| |-- key: string
| |-- value: string (valueContainsNull = true)
|-- skyward: struct (nullable = false)
| |-- tier: string (nullable = false)
| |-- skyward_number: string (nullable = false)
| |-- skyward_points: string (nullable = false)
dataframe2 schema
root
|-- emcg_uuid: string (nullable = true)
|-- name: string (nullable = true)
|-- phone_no: string (nullable = true)
|-- dob: string (nullable = true)
|-- country: string (nullable = true)
|-- travel_type: string (nullable = true)
|-- gdpr_restricted_flg: string (nullable = true)
|-- gdpr_reason_code: string (nullable = true)
|-- document: map (nullable = true)
| |-- key: string
| |-- value: string (valueContainsNull = true)
|-- skyward: struct (nullable = false)
| |-- skyward_number: string (nullable = false)
| |-- tier: string (nullable = false)
| |-- skyward_points: string (nullable = false)
如何解决这个问题?
4条答案
按热度按时间8fq7wneg1#
union
的默认Spark行为是标准的SQL行为,所以是按位置匹配。这意味着,两个DataFrame中的模式必须包含相同的字段,并且相同的字段具有相同的顺序。如果你想通过名称匹配schema,可以使用Spark 2.3中引入的
unionByName
。您也可以重新Map字段:
编辑:我现在看到编辑了。
您可以再次添加这些列:
tmb3ates2#
成果
k4aesqcs3#
如果只有一个字段不同,并且名称已知(“skyward”),则可以解析为:
对于许多这样的结构字段,可以只使用一些循环。
ryevplcw4#
我遇到了同样的问题“错误:只能对具有兼容列类型的表执行联合。
调查了以下可能导致该问题的可能性。
打印dataset 1和dataset 2的模式,以了解dataset 1的当前列顺序,根据dataset 2对齐dataset 1的列,反之亦然。示例:datset 1(column 2,column 1)dataset 2(column 1,column 1)datset1.select(“column 1”,“column 2”)).union(dataset 2)-将排列列并解决问题。