需要根据 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.当边缘情况