【问题标题】:Spark SQL how to query subset of struct fields in Array[Struct]?Spark SQL如何查询Array [Struct]中的结构字段子集?
【发布时间】:2019-09-28 03:17:13
【问题描述】:

我在 Hive 中有一个表,它有一个架构:

root
 |-- startdate: string (nullable = true)
 |-- enddate: string (nullable = true)
 |-- items: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- _id: string (nullable = true)
 |    |    |-- name: string (nullable = true)
 |    |    |-- .......: string (nullable = true)
 |    |    |-- otherfields: string (nullable = true)

我只想从 items 数组字段中获取 _id 和 name 列,即:

|-- items: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- _id: string (nullable = true)
 |    |    |-- name: string (nullable = true)

有没有一种方法可以做到这一点,而无需在 Spark 本身中进行额外的转换,以便只从 Hive 中检索实际的列?

我使用的是 Spark 2.2。

【问题讨论】:

    标签: apache-spark hive apache-spark-sql


    【解决方案1】:

    您可以尝试以下方法:

    data.select("items._id", "items.name")
    

    虽然它可能会导致:

    root
     |-- _id: array (nullable = true)
     |    |-- element: string (containsNull = true)
     |-- name: array (nullable = true)
     |    |-- element: string (containsNull = true)
    

    在 Spark 2.4+ 中,您可以尝试利用 arrays_zip

    【讨论】:

    • 是的,我已经尝试过了,它会生成两个单独的数组。不幸的是,正如我所说,我使用的是 Spark 2.2。有没有办法在 Spark 本身没有额外转换的情况下做到这一点?
    • 很遗憾,如果不使用 UDF,我认为您无法做到
    • 也许真正的问题是:想要达到什么目的?为什么不直接使用 UDF? :)
    • 我尽量不加载冗余数据以节省时间和内存
    • 请记住,节省时间/内存可能取决于您的底层存储格式是否支持这种分区/优化。我不知道不同序列化格式如何处理数组的细节,以及是否有可能将这种计算一直向下推以减少 I/O 和网络带宽。 IMO:一旦加载,在 UDF 上使用“纯 Spark 函数”可能只会获得很少(并且可能不明显)的收益
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 2020-10-27
    相关资源
    最近更新 更多