【问题标题】:Flattening the array of a dataframe column into separate columns and corresponding values in Spark scala在 Spark scala 中将数据框列的数组展平为单独的列和相应的值
【发布时间】:2021-08-21 11:14:15
【问题描述】:

下面是我的数据框。我通过将 java Json 列表转换为数据框来获取此数据框。

+---+--------------------------------------------------------------------------------------------------+
|   |                              Value                                                              |
+---+---+----------------------------------------------------------------------------------------------+
|  1| {"Name":"john","type":"On(r) TV: Channel","desc_lang":"en~en~en~en","copyright":"Copyright 2021"}|
|-- --------------------------------------------------------------------------------------------------+
|  2| {"Name":"Dane","type":"On(r) TV: Prgrm","desc_lang":"FR~FR~FR~FR","copyright":"Copyright 2022"}  |
+------------------------------------------------------------------------------------------------------+

所需的输出如下。

+---+---------------------+---+-------+----------------+
|Name|    type            | desc_lang | copyright      |
+----+--------------------+-----------+-------+--------+
|john| On(r) TV: Channel  | en~en~en~en |Copyright 2021|
|Dane| On(r) TV: Prgrm    | FR~FR~FR~FR |Copyright 2022|
+----+--------------------+-------------+--------------+

这只是示例数据,我实际上有大约 180 列需要展平为上述表格格式。下面是我尝试拆分的代码,但它没有给我想要的输出。

val dfcollect = DF.withColumn("finalop", split($"Value", ":"))

有人可以协助解决如何实现此输出。

【问题讨论】:

    标签: json scala apache-spark apache-spark-sql


    【解决方案1】:

    您可以使用from_json 并星号展开生成的结构:

    val df2 = df.select(
        from_json(
            col("Value"), 
            schema_of_json(df.select("Value").head().getString(0))
        ).as("Value")
    ).select("Value.*")
    
    df2.show
    +----+-------------+-----------+---------------+
    |Name|    copyright|  desc_lang|           type|
    +----+-------------+-----------+---------------+
    |john|Copyright2021|en~en~en~en|On(r)TV:Channel|
    |Dane|Copyright2022|FR~FR~FR~FR|  On(r)TV:Prgrm|
    +----+-------------+-----------+---------------+
    

    【讨论】:

    • df.select("Value").head().getString(0) 如果第一个元素为空或空怎么办?
    • @mck 感谢您的回复。使用上面的代码,我可以获得输出,但列不按顺序排列。它实际上是按字母顺序给出列。但我需要数据框中的列顺序。请告诉我如何获得这个。
    • 根据定义,JSON 对象是字段的无序集合(例如,参见 this)。为什么要让列保持原来的顺序?
    • 解析后,我想将此数据加载到具有预定义架构的增量表中。因此,我需要将列顺序作为目标架构。
    • 那么你可以从增量表中获取架构并使用select重新排列列
    猜你喜欢
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 2018-09-29
    • 2021-06-09
    • 1970-01-01
    • 2021-07-29
    相关资源
    最近更新 更多