只能对具有兼容列类型的表执行联合
Posted
技术标签:
【中文标题】只能对具有兼容列类型的表执行联合【英文标题】:Union can only be performed on tables with the compatible column types 【发布时间】:2020-08-14 03:58:09 【问题描述】:u"只能对列类型兼容的表进行联合。map
架构如下所示:
数据集 1
root
|-- name: string (nullable = true)
|-- count: struct (nullable = true)
| |-- int: integer (nullable = true)
| |-- long: null (nullable = true)
数据集 2
root
|-- name: string (nullable = true)
|-- count: map (nullable = true)
| |-- key: string
| |-- value: integer (valueContainsNull = true)
使用以下方法时无法对 DF 进行联合操作:
data= dataset1_df.union(dataset2_df)
如何解决?
更新: 我想更改架构,例如:
数据集 1
root
|-- name: string (nullable = true)
|-- count: long
数据集2
root
|-- name: string (nullable = true)
|-- count: long
【问题讨论】:
【参考方案1】:简单的解决方案是将其中一个数据帧进行类型转换以匹配另一个数据帧,如下所示-
val df1 = spark.sql("select 'foo' name, named_struct('int', 1, 'long', null) count")
df1.show(false)
df1.printSchema()
/**
* +----+-----+
* |name|count|
* +----+-----+
* |foo |[1,] |
* +----+-----+
*
* root
* |-- name: string (nullable = false)
* |-- count: struct (nullable = false)
* | |-- int: integer (nullable = false)
* | |-- long: null (nullable = true)
*/
val df2 = spark.sql("select 'bar' name, map('2', 3) count")
df2.show(false)
df2.printSchema()
/**
* +----+--------+
* |name|count |
* +----+--------+
* |bar |[2 -> 3]|
* +----+--------+
*
* root
* |-- name: string (nullable = false)
* |-- count: map (nullable = false)
* | |-- key: string
* | |-- value: integer (valueContainsNull = false)
*/
df1.withColumn("count",
map($"count.int".cast("string"), $"count.long".cast("integer")))
.union(df2)
.show(false)
/**
* +----+--------+
* |name|count |
* +----+--------+
* |foo |[1 ->] |
* |bar |[2 -> 3]|
* +----+--------+
*/
【讨论】:
以上是关于只能对具有兼容列类型的表执行联合的主要内容,如果未能解决你的问题,请参考以下文章