需要根据 1 列的值在数据集的列中设置值
Need to set values in columns of dataset based on value of 1 column
我在 java 中有一个 Dataset<Row>
。我需要读取 1 列的值,这是一个 JSON 字符串,解析它,并根据解析的 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|
----------------------------------------
我想不出办法。请帮助代码。
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。我正在大量使用它。考虑将其添加到书签和不时参考。
您可以使用 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")))
我在 java 中有一个 Dataset<Row>
。我需要读取 1 列的值,这是一个 JSON 字符串,解析它,并根据解析的 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|
----------------------------------------
我想不出办法。请帮助代码。
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。我正在大量使用它。考虑将其添加到书签和不时参考。
您可以使用 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")))