【问题标题】:In SparkSQL how could I select a subset of columns from a nested struct and keep it as a nested struct in the result using SQL statement?在 SparkSQL 中,如何从嵌套结构中选择列的子集并使用 SQL 语句将其作为嵌套结构保留在结果中?
【发布时间】:2022-07-25 22:07:59
【问题描述】:

我可以在 SparkSQL 中做如下语句:

result_df = spark.sql("""select
    one_field,
    field_with_struct
  from purchases""")

生成的数据帧将在field_with_struct 中具有完整结构的字段。

one_field field_with_struct
123 {name1,val1,val2,f2,f4}
555 {name2,val3,val4,f6,f7}

我只想从field_with_struct 中选择几个字段,但在结果数据框中将它们保持在结构中。如果有可能(这不是真正的代码):

result_df = spark.sql("""select
    one_field,
    struct(
      field_with_struct.name,
      field_with_struct.value2
    ) as my_subset
  from purchases""")

要得到这个:

one_field my_subset
123 {name1,val2}
555 {name2,val4}

有没有办法用 SQL 做到这一点? (不使用流畅的 API)

【问题讨论】:

    标签: pyspark apache-spark-sql


    【解决方案1】:

    事实上,我提供的伪代码是有效的。对于嵌套的对象数组,它并不是那么简单。首先,应该分解数组(EXPLODE() 函数),然后选择一个子集。之后就可以创建一个 COLLECT_LIST()。

    WITH
      unfold_by_items AS (SELECT id, EXPLODE(Items) AS item FROM spark_tbl_items)
    , format_items as (SELECT
        id
        , STRUCT(
                  item.item_id
                , item.name
            ) AS item
        FROM unfold_by_items)
    , fold_by_items AS (SELECT id, COLLECT_LIST(item) AS Items FROM format_items GROUP BY id)
    
    SELECT * FROM fold_by_items
    

    这将只从 Items 的结构中选择两个字段,最后返回一个数据集,该数据集再次包含一个带有 Items 的数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多