Нахождение нулевых значений в списке структур spark sql - PullRequest
0 голосов
/ 30 января 2019

Мне нужно количество строк в тексте JSON, где A.adList.optionalField = null

JSON выглядит так:

{  
   "A":{  
      "adList":[  
         {  
            "a":"qwfqw"
         },
         {  
            "b":"fqw",
            "c":23423,
            "optionalField":null
         }
      ]
   }
}

Это работает:

df.select(df("id")).where(array_contains(df("A.adList.optionalField"),4)).registerTempTable("hb")


select count(*) from hb

Однако я не могу сделать то же самое для NULL

df.select(df("id")).where(array_contains(df("A.adList.optionalField"),"null")).registerTempTable("hb")

Любая идея, как я могу сделать это легко?Вопрос Проверьте, содержит ли столбец типа типа null , здесь говорится о возможных значениях NULL в Seq [Int], где я имею дело с возможным полем NULL в Struct в Seq [Struct], как указано выше.

1 Ответ

0 голосов
/ 30 января 2019

Функция array_contains () не допускает null во втором параметре.Чтобы проверить, имеет ли массив значение null, вы можете сделать sort_array (), установив ascending = true.Затем, если первый элемент имеет значение null, вы можете проверить его снова isnull (sort_array (col (a), true) (0))

Проверьте это:

scala> val df = spark.read.format("json").option("multiLine","true").load("/tmp/stack/tanvi.json").toDF("id")
df: org.apache.spark.sql.DataFrame = [id: struct<adList: array<struct<a:string,b:string,c:bigint,optionalField:string>>>]

scala> df.printSchema
root
 |-- id: struct (nullable = true)
 |    |-- adList: array (nullable = true)
 |    |    |-- element: struct (containsNull = true)
 |    |    |    |-- a: string (nullable = true)
 |    |    |    |-- b: string (nullable = true)
 |    |    |    |-- c: long (nullable = true)
 |    |    |    |-- optionalField: string (nullable = true)


scala> df.select(sort_array(df("id.adList.optionalField"),true)(0),size(df("id.adList.optionalField"))).show(false)
+---------------------------------------------------------------+------------------------------------------------+
|sort_array(id.adList.optionalField AS `optionalField`, true)[0]|size(id.adList.optionalField AS `optionalField`)|
+---------------------------------------------------------------+------------------------------------------------+
|null                                                           |2                                               |
+---------------------------------------------------------------+------------------------------------------------+


scala> df.select(sort_array(df("id.adList.optionalField"),true)(1),size(df("id.adList.optionalField"))).show(false)
+---------------------------------------------------------------+------------------------------------------------+
|sort_array(id.adList.optionalField AS `optionalField`, true)[1]|size(id.adList.optionalField AS `optionalField`)|
+---------------------------------------------------------------+------------------------------------------------+
|null                                                           |2                                               |
+---------------------------------------------------------------+------------------------------------------------+


scala> df.select(isnull(sort_array(df("id.adList.optionalField"),true)(0)),size(df("id.adList.optionalField"))).show(false)
+-------------------------------------------------------------------------+------------------------------------------------+
|(sort_array(id.adList.optionalField AS `optionalField`, true)[0] IS NULL)|size(id.adList.optionalField AS `optionalField`)|
+-------------------------------------------------------------------------+------------------------------------------------+
|true                                                                     |2                                               |
+-------------------------------------------------------------------------+------------------------------------------------+


scala>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...