У меня есть фрейм данных со следующей схемой:
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-дескриптор нулевым в этом случае?В качестве альтернативы, если есть более простой способ получения уникальных значений, я хотел бы попробовать это.