Получить отдельные элементы из строк типа ArrayType в столбце данных Spark - PullRequest
0 голосов
/ 14 сентября 2018

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

    root
     |-- e: array (nullable = true)
     |    |-- element: string (containsNull = true)

Например, инициировать фрейм данных:

val df = Seq(Seq("73","73"), null, null, null, Seq("51"), null, null, null, Seq("52", "53", "53", "73", "84"), Seq("73", "72", "51", "73")).toDF("e")

df.show()

+--------------------+
|                   e|
+--------------------+
|            [73, 73]|
|                null|
|                null|
|                null|
|                [51]|
|                null|
|                null|
|                null|
|[52, 53, 53, 73, 84]|
|    [73, 72, 51, 73]|
+--------------------+

Я бы хотел, чтобы вывод был:

+--------------------+
|                   e|
+--------------------+
|                [73]|
|                null|
|                null|
|                null|
|                [51]|
|                null|
|                null|
|                null|
|    [52, 53, 73, 84]|
|        [73, 72, 51]|
+--------------------+

Я пытаюсь следующее udf:

def distinct(arr: TraversableOnce[String])=arr.toList.distinct
val distinctUDF=udf(distinct(_:Traversable[String]))

Но это работает только тогда, когда строки не являются нулевыми, то есть

df.filter($"e".isNotNull).select(distinctUDF($"e")) 

дает мне

+----------------+
|          UDF(e)|
+----------------+
|            [73]|
|            [51]|
|[52, 53, 73, 84]|
|    [73, 72, 51]|
+----------------+

но

df.select(distinctUDF($"e")) 

не удается.Как мне сделать UDD-дескриптор нулевым в этом случае?В качестве альтернативы, если есть более простой способ получения уникальных значений, я хотел бы попробовать это.

1 Ответ

0 голосов
/ 14 сентября 2018

Вы можете использовать when().otherwise(), чтобы применить свой UDF, только когда значение столбца не равно null.В этом случае .otherwise(null) также может быть пропущено, поскольку по умолчанию оно равно null, если не указано предложение otherwise.

val distinctUDF = udf( (s: Seq[String]) => s.distinct )

df.select(when($"e".isNotNull, distinctUDF($"e")).as("e"))
...