只能对具有兼容列类型的表执行联合

Posted

技术标签:

【中文标题】只能对具有兼容列类型的表执行联合【英文标题】:Union can only be performed on tables with the compatible column types 【发布时间】:2020-08-14 03:58:09 【问题描述】:

u"只能对列类型兼容的表进行联合。map structint:int,long:null 在第二个表的第N列。

架构如下所示:

数据集 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]|
      * +----+--------+
      */

【讨论】:

以上是关于只能对具有兼容列类型的表执行联合的主要内容,如果未能解决你的问题,请参考以下文章

AnalysisException:u“除了只能在具有兼容列类型的表上执行

Athena - 具有不兼容数据类型的联合表

联合分配的不兼容类型错误

SQL语句兼容性规范

14联合查询

用于 Kudu 兼容性的 Spark 数据帧转换列