Вы можете проанализировать столбец, содержащий JSON String, и построить кадр данных, содержащий все столбцы в JSON. Вот пример -
val jsonData = """{"rating_text": "Excellent", "rating_color": "3F7E00", "votes": "778", "aggregate_rating": "4.5"}"""
val schema = {StructType(
List(
StructField("rating_text", StringType, nullable = false),
StructField("rating_color", StringType, nullable = false),
StructField("votes", StringType, nullable = false),
StructField("aggregate_rating", StringType, nullable = false)
))}
val df = spark.createDataset(Seq(jsonData)).toDF("user_rating")
val dfWithParsedJson = df.withColumn("json_data",from_json($"user_rating",schema))
dfWithParsedJson.select($"user_rating",$"json_data.rating_text", $"json_data.rating_color",$"json_data.votes",$"json_data.aggregate_rating").show()
Результат -
+--------------------+-----------+------------+-----+----------------+
| user_rating|rating_text|rating_color|votes|aggregate_rating|
+--------------------+-----------+------------+-----+----------------+
|{"rating_text": "...| Excellent| 3F7E00| 778| 4.5|
+--------------------+-----------+------------+-----+----------------+
Если json находится в файле, вы можете просто прочитать его как
//file contains - {"user_rating": {"rating_text": "Excellent", "rating_color": "3F7E00", "votes": "778", "aggregate_rating": "4.5"}}
val df = spark.read.json("path to test.txt")
df.select("user_rating.rating_text").show()
Вы можете читать данные из объекта Row
, используя такие индексы, как
df.map{ row =>
(row.getStruct(0).getString(0))
}.show()
//Used getStruct(index) because the data type is a complex class. for ordinary values you can use getString, getLong etc
Я настоятельно рекомендую использовать схему для чтения и работы с json. Это сэкономит вам массу ошибок во время выполнения и намного быстрее.