Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 重载方法foreachBatch和替代方法_Scala_Apache Spark - Fatal编程技术网

Scala 重载方法foreachBatch和替代方法

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

我正在尝试将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)=>

这是我的代码:

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中的一些更改”吗?我发现这是一个可能的解释: