需要根据 1 列的值设置数据集列中的值

Posted

技术标签:

【中文标题】需要根据 1 列的值设置数据集列中的值【英文标题】:Need to set values in columns of dataset based on value of 1 column 【发布时间】: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|
----------------------------------------

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

【问题讨论】:

【参考方案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")))

【讨论】:

以上是关于需要根据 1 列的值设置数据集列中的值的主要内容,如果未能解决你的问题,请参考以下文章

根据另一列的值过滤数据框列[重复]

如何根据 PySpark 数据框的另一列中的值修改列? F.当边缘情况

Google BigQuery - 根据另一列中的值减去一列的 SUM

根据熊猫中多列的条件(最大值)替换列中的值

数据集列中的字符串替换不起作用

使用来自另一个数据集的值搜索和更新 Spark 数据集列