根据数据集中某一列的值,需要设置数据集中其他列的值。

5

我有一个Java中的 Dataset<Row>,其中一个列是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|
----------------------------------------

我无法想出一种方法来做到这一点。请给出代码帮助。

2个回答

2

Spark中存在一个名为get_json_object的函数。假设你有一个名为df的数据框,你可以选择以下方式来解决问题:

使用get_json_object函数。

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

首先,请确保您的json属性使用双引号而不是单引号。

注意:这里有完整的Spark SQL函数列表,我经常使用它。考虑将其添加到书签并定期参考。


0

你可以使用用户定义函数(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")))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接