需要根据 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")))