Scala 重载方法foreachBatch和替代方法
我正在尝试将json文件序列化为拼花格式。我有一个错误: 错误:(34,25)重载了方法foreachBatch和替代项: (函数:org.apache.spark.api.java.function.VoidFunction2[org.apache.spark.sql.Dataset[org.apache.spark.sql.Row],java.lang.Long])org.apache.spark.sql.streaming.DataStreamWriter[org.apache.spark.sql.Row] (函数:(org.apache.spark.sql.Dataset[org.apache.spark.sql.Row],scala.Long)=>Unit)org.apache.spark.sql.streaming.DataStreamWriter[org.apache.spark.sql.Row] 无法应用于((org.apache.spark.sql.DataFrame,scala.Long)=>org.apache.spark.sql.DataFrame) askDF.writeStream.foreachBatch{(askDF:DataFrame,batchId:Long)=> 这是我的代码:Scala 重载方法foreachBatch和替代方法,scala,apache-spark,Scala,Apache Spark,我正在尝试将json文件序列化为拼花格式。我有一个错误: 错误:(34,25)重载了方法foreachBatch和替代项: (函数:org.apache.spark.api.java.function.VoidFunction2[org.apache.spark.sql.Dataset[org.apache.spark.sql.Row],java.lang.Long])org.apache.spark.sql.streaming.DataStreamWriter[org.apache.spark
package fr.fdj
import org.apache.spark.sql.{DataFrame, SparkSession}
import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
object serialize {
val spark: SparkSession = SparkSession.builder()
.master("local[1]")
.appName("serialize")
.getOrCreate()
def main(args : Array[String]) {
spark.sparkContext.setLogLevel("ERROR")
//schema definition
val mySchema = StructType(Array(
StructField("Species", StringType, true),
StructField("Race", StringType, true),
StructField("Color", StringType, true),
StructField("Age", IntegerType, true)
))
val askDF = spark
.readStream
.format("json")
.option("header", "true")
.schema(mySchema)
.load("/src/main/scala/file.json")
askDF.writeStream.foreachBatch { (askDF: DataFrame, batchId: Long) =>
askDF.persist()
askDF.write.parquet("/src/main/scala/file.json")
askDF.unpersist()
}.start().awaitTermination()
}
}
我想您使用的是Scala 2.12 由于Scala 2.12中的一些更改,DataStreamWriter.foreachBatch方法需要对代码进行一些更新,否则会出现这种歧义 您可以在此处检查两种foreachBatch方法: 我想您可以改用scala 2.11,或者查看解决问题的链接: 在代码中,您可以尝试以下操作:
def myFunc( askDF:DataFrame, batchID:Long ) : Unit = {
askDF.persist()
askDF.write.parquet("/src/main/scala/file.json")
askDF.unpersist()
}
askDF.writeStream.foreachBatch(myFunc _).start().awaitTermination()
正如所指出的,存在Spark兼容性版本问题。我能找到的最佳解决方案如下所述:
使用类型为的函数创建一个变量,并显式返回
val myFunc=(数据帧,长)=>Unit=
(askDF:DataFrame,batchId:Long)=>{
askDF.persist()
askDF.write.parquet(“/src/main/scala/file.json”)
askDF.unpersist()
}
在foreachBatch方法中使用此新变量
askDF
.writeStream
.foreachBatch(myFunc)
.start()
.终止
您是否有foreachBatch()函数的解决方案或替代方案?您真的需要结构化流式处理吗?从Spark 2.4.5、Scala 2.11迁移到Spark 3.0.1、Scala 2.12时,我遇到了这个问题。正在移动我的.foreachBatch{…}中的所有内容
out to it’s own method 100%解决了我的问题。谢谢!你能详细说明一下“由于Scala 2.12中的一些更改”吗?我发现这是一个可能的解释: