Я искал способ добавить свои необработанные (JSON) данные в виде столбца при чтении моих данных в Spark DataFrame. У меня есть один способ сделать это с помощью соединения, но я надеюсь, что есть способ сделать это за одну операцию, используя Spark 2.2.x +.
Например, данные:
{"team":"Golden Knights","colors":"gold,red,black","origin":"Las Vegas"}
{"team":"Sharks","origin": "San Jose", "eliminated":"true"}
{"team":"Wild","colors":"red,green,gold","origin":"Minnesota"}
При выполнении:
val logs = sc.textFile("/Users/vgk/data/tiny.json") // example data file
spark.read.json(logs).show
Как и ожидалось, мы получим:
+--------------+----------+--------------------+--------------+
| colors|eliminated| origin| team|
+--------------+----------+--------------------+--------------+
|gold,red,black| null| Las Vegas|Golden Knights|
| null| true| San Jose| Sharks|
|red,green,gold| null| Minnesota| Wild|
|red,white,blue| false|District of Columbia| Capitals|
+--------------+----------+--------------------+--------------+
То, что я хотел бы иметь при начальной загрузке, это выше, но с необработанными данными JSON в качестве дополнительного столбца. Например (усеченные необработанные значения):
+--------------+-------------------------------+--------------+--------------------+
| colors|eliminated| origin| team| value|
+--------------+----------+--------------------+--------------+--------------------+
|red,white,blue| false|District of Columbia| Capitals|{"colors":"red,wh...|
|gold,red,black| null| Las Vegas|Golden Knights|{"colors":"gold,r...|
| null| true| San Jose| Sharks|{"eliminated":"tr...|
|red,green,gold| null| Minnesota| Wild|{"colors":"red,gr...|
+--------------+----------+--------------------+--------------+--------------------+
Неидеальное решение включает объединение:
val logs = sc.textFile("/Users/vgk/data/tiny.json")
val df = spark.read.json(logs).withColumn("uniqueID",monotonically_increasing_id)
val rawdf = df.toJSON.withColumn("uniqueID",monotonically_increasing_id)
df.join(rawdf, "uniqueID")
Что приводит к тому же кадру данных, что и выше, но с добавленным столбцом uniqueID
. Кроме того, JSON отображается из DF и не обязательно является «необработанными» данными. На практике они равны, но для моего случая использования реальные исходные данные предпочтительнее.
Кто-нибудь знает решение, которое собирает необработанные данные JSON в качестве дополнительного столбца при загрузке?