Spark возвращает массив нулевых значений при выборе дочерних объектов - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть объект:

{
  "id": "123",
  "col_1": null,
  "sub_entities": [
    { "sub_entity_id": "s-1", "col_2": null },
    { "sub_entity_id": "s-2", "col_2": null }
  ]
}

, и я загрузил его в spark: val entities = spark.read.json("...").

entities.filter(size($"sub_entities.col_2") === 0) ничего не возвращает. Поведение кажется странным, потому что все col_2 являются нулевыми, но нулевое значение считается.

Затем я попытался выбрать col_2 и заметил, что он возвращает массив нулевых значений (в данном случае 2 нулевых значения).

entities.select($"col_1", $"sub_entities.col_2").show(false)

+--------+------------------+                        
|col_1   |sub_entities.col_2|
+--------+------------------+
|null    |[,]               |
+--------+------------------+

Как написать запрос, который возвращает только объекты из массива, где col_2 не равно нулю?

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Это отфильтровывает только массив col_2, как вы упомянули, если вам нужен другой вывод, когда вы делаете df.select($"col_1", $"sub_entities").show, я могу обновить ответ:

val json =  
"""
{
    "id": "123",
    "col_1": null,
    "sub_entities": [
        { "sub_entity_id": "s-1", "col_2": null },
        { "sub_entity_id": "s-2", "col_2": null }
    ]
}
"""
val df = spark.read.json(Seq(json).toDS)

val removeNulls = udf((arr : Seq[String]) => arr.filter((x: String) => x != null))
df.select($"col_1", removeNulls($"sub_entities.col_2").as("sub_entities.col_2")).show(false)

+-----+------------------+
|col_1|sub_entities.col_2|
+-----+------------------+
|null |[]                |
+-----+------------------+
1 голос
/ 26 февраля 2020

Для запроса array объектов нам нужно сначала сгладить массив с помощью функции explode, а затем запросить фрейм данных!

Example:

val df=spark.read.json(Seq("""{"id": "123","col_1": null,"sub_entities": [  { "sub_entity_id": "s-1", "col_2": null },  { "sub_entity_id": "s-2", "col_2": null }]}""").toDS)

df.selectExpr("explode(sub_entities)","*").select("col.*","id","col_1").show()

//+-----+-------------+---+-----+
//|col_2|sub_entity_id| id|col_1|
//+-----+-------------+---+-----+
//| null|          s-1|123| null|
//| null|          s-2|123| null|
//+-----+-------------+---+-----+

df.selectExpr("explode(sub_entities)","*").select("col.*","id","col_1").filter(col("col_2").isNull).show()

//+-----+-------------+---+-----+
//|col_2|sub_entity_id| id|col_1|
//+-----+-------------+---+-----+
//| null|          s-1|123| null|
//| null|          s-2|123| null|
//+-----+-------------+---+-----+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...