【问题标题】:create a json column from some rows by SQL通过 SQL 从某些行创建一个 json 列
【发布时间】:2020-07-09 20:47:25
【问题描述】:

我正在尝试使用 SQL(Spark SQL 3.0,databricks runtime 7.0)从现有表创建新表。 我想将一个特定列的一些行聚合到新表中的一个 json 列中。

现有表

id,     year,  month, val
u_ced    2002   05    v_scyronc
u_ced    2002   05    v_ytbtbdv
u_ced    2002   05    v_utncasx
u_pny    2005   07    v_opcrgae
u_pny    2005   07    v_wytnecs 

               

我需要一张像这样的新桌子

id,       val_json
u_ced     {{"shown": true, "val_id": "v_scyronc" },
          {"shown": true, "val_id": "v_ytbtbdv" },
          {"shown": true, "val_id": "v_utncasx" },
          {"shown": true, "val_id": "v_opcrgae" },
          {"shown": true, "val_id": "v_wytnecs" }
         }} 

 u_pny    {{"shown": true, "val_id": "v_opcrgae" },
          {"shown": true, "val_id": "v_wytnecs" }              
         }} 

我想我需要一个“分组依据”,但我不知道如何创建 json 列。

我试过了:

SELECT json_object(array_agg(id), array_agg(val)) 

但是,我得到了错误:

 Error in SQL statement: AnalysisException: Undefined function: 'json_object'. 
  This function is neither a registered temporary function nor a permanent function registered in the database 'default'

希望任何人都可以帮助我解决这个问题。

谢谢

【问题讨论】:

  • 检查您的 postgresql 版本,如建议的 here。我知道这不是您的主要问题,但消息错误在您的目标之前。

标签: mysql sql json apache-spark-sql


【解决方案1】:

也许这很有用-


    df.show(false)
    df.printSchema()

    /**
      * +-----+-----+------+---------+
      * |id,  |year,|month,|val      |
      * +-----+-----+------+---------+
      * |u_ced|2002 |5     |v_scyronc|
      * |u_ced|2002 |5     |v_ytbtbdv|
      * |u_ced|2002 |5     |v_utncasx|
      * |u_pny|2005 |7     |v_opcrgae|
      * |u_pny|2005 |7     |v_wytnecs|
      * +-----+-----+------+---------+
      *
      * root
      * |-- id,: string (nullable = true)
      * |-- year,: integer (nullable = true)
      * |-- month,: integer (nullable = true)
      * |-- val: string (nullable = true)
      */

    df.withColumn("shown", lit(true))
      .withColumnRenamed("val", "val_id")
      .withColumn("val_json", struct(col("shown"), col("val_id")))
      .groupBy("id")
      .agg(collect_list("val_json").as("val_json"))
      .select(col("id"), to_json(col("val_json")).as("val_json"))
      .show(false)

    /**
      * +-----+-------------------------------------------------------------------------------------------------------------+
      * |id   | val_json                                                                                      |
      * +-----+-------------------------------------------------------------------------------------------------------------+
      * |u_pny|[{"shown":true,"val_id":"v_opcrgae"},{"shown":true,"val_id":"v_wytnecs"}]                                    |
      * |u_ced|[{"shown":true,"val_id":"v_scyronc"},{"shown":true,"val_id":"v_ytbtbdv"},{"shown":true,"val_id":"v_utncasx"}]|
      * +-----+-------------------------------------------------------------------------------------------------------------+
      */

【讨论】:

    【解决方案2】:

    Spark SQL 没有函数“json_object”。

    看到这个spark sql built-in functions

    functionto_json,collect_listconcat_ws 可能有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-18
      • 2017-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      相关资源
      最近更新 更多