Необходимо установить значения в столбцах набора данных на основе значения 1 столбца - PullRequest
5 голосов
/ 05 июня 2019

У меня есть Dataset<Row> в Java.Мне нужно прочитать значение 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|
----------------------------------------

Я не могу найти способ сделать это,Пожалуйста, помогите с кодом.

Ответы [ 2 ]

2 голосов
/ 05 июня 2019

В Spark существует функция get_json_object.Предполагая, что у вас есть фрейм данных с именем df, вы можете выбрать этот способ решения вашей проблемы:

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

Но, прежде всего, убедитесь, что ваш атрибут json содержит двойные кавычки вместо одинарныхиз них.

Примечание: имеется полный список функций Spark SQL .Я использую это сильно.Попробуйте добавить его в закладки и ссылаться время от времени.

0 голосов
/ 05 июня 2019

Вы можете использовать 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")))
...