序列化错误:如何使用使用java.util.List [String]的函数创建使用ArrayType(StringType)列的UDF?

时间:2020-02-08 00:33:35

标签: java scala dataframe apache-spark user-defined-functions

我有一个带有架构的数据框:

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

内容看起来像这样

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

我想添加另一个称为array [string]类型的“ compacted”列,该列将使用UDF在下面存储函数的结果。该函数接受一个Java列表作为输入java.util.List [String],并输出一个Java列表-但是我将函数输出到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,...|
+---+--------------------+--------------------+

任何指针表示赞赏!

0 个答案:

没有答案
相关问题