Ошибка сериализации: как создать UDF, который использует столбец ArrayType (StringType), используя функцию, которая использует java .util.List [String]? - PullRequest
0 голосов
/ 08 февраля 2020

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

df.printSchema()
root
 |-- _1: integer (nullable = false)
 |-- _2: array (nullable = true)
 |    |-- element: string (containsNull = true)

Содержимое выглядит так

df.show(1)
+---+--------------------+
| _1|                  _2|
+---+--------------------+
|  1|[863e3434fffffff,...|
+---+--------------------+

Я хочу добавить еще один столбец с именем «сжатый» типа array [string], в котором будут храниться Результаты моей функции ниже, используя UDF. Функция принимает Java List в качестве входных данных java .util.List [String], а также выводит Java List - но у меня есть функция, выводящая в массив Scala, например:

def compactf(s: java.util.List[String])  = { H3.instance.compactAddress(s).asScala.toArray }

Функция работает так, как я ожидаю, возвращая массив Scala.

compactf(my_test_java_list)
res48: Array[String] = Array(863e3434fffffff, 863e3435fffffff, 863e3092fffffff, 863e3090fffffff, 863e30ba7ffffff, 863e30bafffffff, 863e356b7ffffff, 863e356a7ffffff, 863e350d7ffffff, 863e350f7ffffff, 863e35c5fffffff, 863e35c57ffffff, 863e35d8fffffff, 863e35d9fffffff, 863e3436fffffff, 863e34347ffffff, 863e34357ffffff, 863e342afffffff, 863e3428fffffff, 863e30927ffffff, 863e30907ffffff, 863e3091fffffff, 863e308e7ffffff, 863e308efffffff, 863e30bb7ffffff, 863e30b87ffffff, 863e30b8fffffff, 863e30a77ffffff, 863e30a67ffffff, 863e35697ffffff, 863e35687ffffff, 863e356afffffff, 863e35757ffffff, 863e35777ffffff, 863e350dfffffff, 863e350c7ffffff, 863e350e7ffffff, 863e3511fffffff, 863e35117ffffff, 863e35c4fffffff)

Однако, когда я пытаюсь включить его в udf (ниже), он не работает. Например, это приводит к ошибке сериализации (задача не сериализуема):

val compact2udf = udf(compactf _)
df.withColumn("compacted", compact2udf(col("_2")))

df.withColumn("compacted", compact2udf(col("_2"))).show()
org.apache.spark.SparkException: Task not serializable

Что я хочу:

+---+--------------------+--------------------+
| _1|                  _2|           compacted|
+---+--------------------+--------------------+
|  1|[863e3434fffffff,...|[863e3092fffffff,...|
+---+--------------------+--------------------+

Любые указатели приветствуются!

...