выровнять структуру вложенных данных в Spark - PullRequest
1 голос
/ 18 июня 2019

У меня есть следующий фрейм данных:

 df.show()
+--------------------+--------------------+----+--------+---------+--------------------+--------+--------------------+
|             address|         coordinates|  id|latitude|longitude|                name|position|                json|
+--------------------+--------------------+----+--------+---------+--------------------+--------+--------------------+
|Balfour St / Brun...|[-27.463431, 15.352472|79.0|    null|     null|79 - BALFOUR ST /...|    null|[-27.463431, 153.041031]|
+--------------------+--------------------+----+--------+---------+--------------------+--------+--------------------+

Я хочу сгладить столбец JSON. Я сделал:

val jsonSchema  = StructType(Seq(
StructField("latitude", DoubleType, nullable = true),
StructField("longitude", DoubleType, nullable = true)))

val a = df.select(from_json(col("json"), jsonSchema) as "content")

но

a.show() gives me :
+-------+
|content|
+-------+
|   null|
+-------+

Есть идеи, как правильно проанализировать json col и получить содержимое col во втором кадре данных (a), не равным NULL?

Необработанные данные представлены как:

{
    "id": 79,
    "name": "79 - BALFOUR ST / BRUNSWICK ST",
    "address": "Balfour St / Brunswick St",
    "coordinates": {
      "latitude": -27.463431,
      "longitude": 153.041031
    }
  }

Большое спасибо

1 Ответ

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

Проблема в вашей схеме. Вы пытаетесь получить доступ к вложенной коллекции значений, как обычное значение. Я внес изменения в вашу схему, и она сработала для меня.

val df = spark.createDataset(
  """
    |{
    |    "id": 79,
    |    "name": "79 - BALFOUR ST / BRUNSWICK ST",
    |    "address": "Balfour St / Brunswick St",
    |    "coordinates": {
    |      "latitude": -27.463431,
    |      "longitude": 153.041031
    |    }
    |  }
  """.stripMargin :: Nil)

val jsonSchema = StructType(Seq(
  StructField("name", StringType, nullable = true),

  StructField("coordinates",
    StructType(Seq(
      StructField("latitude", DoubleType, true)
      ,
      StructField("longitude", DoubleType, true)

    )), true)

)

)
val a = df.select(from_json(col("value"), jsonSchema) as "content")

a.show(false)

выход

+--------------------------------------------------------+
|content                                                 |
+--------------------------------------------------------+
|[79 - BALFOUR ST / BRUNSWICK ST,[-27.463431,153.041031]]|
+--------------------------------------------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...