scala - 带有 collect_list 任务的 Scala UDF 不可序列化
问题描述
我正在尝试在 udf 字段上使用 collect_list 。下面是我的代码。如果我不使用 UDF 派生字段代码可以正常工作。但是使用 UDF 派生字段会出现以下错误
Task not serializable: java.io.NotSerializableException: scala.runtime.LazyRef
class SparkEntry extends Serializable {
def process(): Unit = {
def modifyword = (file_path:String) => {file_path+"_"}
val spark = SparkSession.builder().appName("spp").master("local").getOrCreate()
spark.udf.register("customudf",modifyword)
val someData = Seq(
Row(8, "bat"),
Row(9, "bat"),
Row(64, "mouse"),
Row(9, "mouse"),
Row(-27, "horse"),
Row(9, "horse")
)
val someSchema = List(
StructField("number", IntegerType, true),
StructField("word", StringType, true)
)
val someDF = spark.createDataFrame(
spark.sparkContext.parallelize(someData),
StructType(someSchema)
)
val new_df = someDF.withColumn("new_column",callUDF("customudf",cols = col("word")))
new_df.show()
val grouped_df = new_df.groupBy("word").agg(collect_list(struct(col("new_column"),col("number")))).toDF("word","combined")
grouped_df.show()
spark.close()
} }
解决方案
它对我来说效果很好 -
def modifyword = (file_path:String) => {file_path+"_"}
val spark = SparkSession.builder().appName("spp").master("local").getOrCreate()
spark.udf.register("customudf",modifyword)
val someData = Seq(
Row(8, "bat"),
Row(9, "bat"),
Row(64, "mouse"),
Row(9, "mouse"),
Row(-27, "horse"),
Row(9, "horse")
)
val someSchema = List(
StructField("number", IntegerType, true),
StructField("word", StringType, true)
)
val someDF = spark.createDataFrame(
spark.sparkContext.parallelize(someData),
StructType(someSchema)
)
val new_df = someDF.withColumn("new_column",callUDF("customudf",cols = col("word")))
new_df.show()
val grouped_df = new_df.groupBy("word").agg(collect_list(struct(col("new_column"),col("number")))).toDF("word","combined")
grouped_df.show()
/**
* +------+-----+----------+
* |number| word|new_column|
* +------+-----+----------+
* | 8| bat| bat_|
* | 9| bat| bat_|
* | 64|mouse| mouse_|
* | 9|mouse| mouse_|
* | -27|horse| horse_|
* | 9|horse| horse_|
* +------+-----+----------+
*
* +-----+--------------------+
* | word| combined|
* +-----+--------------------+
* | bat|[[bat_, 8], [bat_...|
* |horse|[[horse_, -27], [...|
* |mouse|[[mouse_, 64], [m...|
* +-----+--------------------+
*/
尝试将 scala 版本升级到2.12.4
. LazyRef在Serializable
那里
推荐阅读
- c++ - 在opengl中,我可以同时使用两个MatrixMode吗?
- reactjs - 在 React 中处理大型矩阵时的性能
- javascript - 如何将特定列的鼠标悬停在角度8中的表格中显示特定数据
- r - 选择要绘制为点须的系数
- java - 从 Java 8 迁移到 Java 11。在运行时,是否可以从用 Java 8 编译的库中的类文件访问 JDK 内部 API?
- python - 我可以调用这样的函数吗?通过创建函数数组/?编码新手
- java - 循环遍历列表 - 当索引到达末尾时,从 0 开始
- java - java中舍入错误的不同行为
- qemu - 如何从 QEMU 中的 C 辅助函数访问执行指令二进制代码(例如,操作码)
- javascript - 为什么我需要在 d3.interval 中包含 d3.now()?