【问题标题】:Need to set values in columns of dataset based on value of 1 column需要根据 1 列的值设置数据集列中的值
【发布时间】:2019-06-05 10:39:25
【问题描述】:

我在 java 中有一个 Dataset<Row>。我需要读取作为 JSON 字符串的 1 列的值,对其进行解析,然后根据解析的 JSON 值设置其他几列的值。

我的数据集如下所示:

|json                     | name|  age |
======================================== 
| "{'a':'john', 'b': 23}" | null| null |
----------------------------------------
| "{'a':'joe', 'b': 25}"  | null| null |
----------------------------------------
| "{'a':'zack'}"          | null| null |
----------------------------------------

我需要这样:

|json                     | name  |  age |
======================================== 
| "{'a':'john', 'b': 23}" | 'john'| 23 |
----------------------------------------
| "{'a':'joe', 'b': 25}"  | 'joe' | 25 |
----------------------------------------
| "{'a':'zack'}"          | 'zack'|null|
----------------------------------------

我想不出办法。请帮忙写代码。

【问题讨论】:

    标签: java apache-spark apache-spark-dataset


    【解决方案1】:

    Spark 中有一个函数get_json_object。 建议,您有一个名为df的数据框,您可以选择这种方式来解决您的问题:

    df.selectExpr("get_json_object(json, '$.a') as name", "get_json_object(json, '$.b') as age" )
    

    但首先,请确保您的 json 属性包含双引号而不是单引号。

    注意: there is a full list of Spark SQL functions。我正在大量使用它。考虑不时将其添加到书签和参考中。

    【讨论】:

      【解决方案2】:

      你可以使用 UDF

      def parseName(json: String): String = ??? // parse json
      val parseNameUDF = udf[String, String](parseName)
      
      def parseAge(json: String): Int = ??? // parse json
      val parseAgeUDF = udf[Int, String](parseAge)
      
      dataFrame
      .withColumn("name", parseNameUDF(dataFrame("json")))
      .withColumn("age", parseAgeUDF(dataFrame("json")))
      

      【讨论】:

        猜你喜欢
        • 2020-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-03
        • 1970-01-01
        • 2021-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多