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