Унифицируйте разрозненный JSON с помощью Apache Spark - PullRequest
0 голосов
/ 06 июня 2018

Пример:

Вот пример данных json, где мы можем увидеть json с различными свойствами:

{"id": 1, "label": "tube", "length": "50m", "diameter": "5cm"}
{"id": 2, "label": "brick", "width": "10cm", "length": "25cm"}
{"id": 3, "label": "sand", "weight": "25kg"}

Ask:

Возможно ли преобразовать этот json в структурированный набор данных в apache spark следующим образом:

+--+-----+------+--------+-----+-------+
|id|label|length|diameter|width|weight |
+--+-----+-----------------------------+
|1 |tube |50m   |5cm     |     |       |
|2 |brick|25cm  |        |10cm |       |
|3 |sand |      |        |     |25kg   |
+--+-----+------+--------+-----+-------+

1 Ответ

0 голосов
/ 06 июня 2018

без проблем.Просто прочитайте его и позвольте Spark определить схему:

val ds = Seq(
  """{"id": 1, "label": "tube", "length": "50m", "diameter": "5cm"}""", 
  """{"id": 2, "label": "brick", "width": "10cm", "length": "25cm"}""",
  """{"id": 3, "label": "sand", "weight": "25kg"}"""
).toDS

spark.read.json(ds).show
// +--------+---+-----+------+------+-----+
// |diameter| id|label|length|weight|width|
// +--------+---+-----+------+------+-----+
// |     5cm|  1| tube|   50m|  null| null|
// |    null|  2|brick|  25cm|  null| 10cm|
// |    null|  3| sand|  null|  25kg| null|
// +--------+---+-----+------+------+-----+

или предоставить ожидаемую схему при чтении:

import org.apache.spark.sql.types._

val fields = Seq("label", "length", "weight", "width")

val schema = StructType(
  StructField("id", LongType) +: fields.map {
    StructField(_, StringType)
  }
)

spark.read.schema(schema).json(ds).show
// +---+-----+------+------+-----+
// | id|label|length|weight|width|
// +---+-----+------+------+-----+
// |  1| tube|   50m|  null| null|
// |  2|brick|  25cm|  null| 10cm|
// |  3| sand|  null|  25kg| null|
// +---+-----+------+------+-----+
...