Apache spark Spark dataframe writeStream forEach未写入所有行

Apache spark Spark dataframe writeStream forEach未写入所有行,apache-spark,apache-kafka,spark-streaming,spark-structured-streaming,Apache Spark,Apache Kafka,Spark Streaming,Spark Structured Streaming,我的数据来源是卡夫卡,我通过以下方式从卡夫卡读取数据: var df = spark .readStream .format("kafka") .option("kafka.bootstrap.servers", "localhost:9092,localhost:9093,localhost:9094") .option("subscribe", "raw_weather") .load() df = df.selectExpr("CAST(value

我的数据来源是卡夫卡,我通过以下方式从卡夫卡读取数据:

var df = spark
    .readStream
    .format("kafka")
    .option("kafka.bootstrap.servers", "localhost:9092,localhost:9093,localhost:9094")
    .option("subscribe", "raw_weather")
    .load()

df = df.selectExpr("CAST(value as STRING)")
        .as[String]
        .select("value")
收到的
值将如下所示:
(725030:147322008,12,31,11,0.6,-6.71001.7,80,6.2,8,0.0,0.0)
。共有8784行(24*366)传递给卡夫卡

我试图在DB2数据库中使用一个扩展了
org.apache.spark.sql.ForeachWriter[org.apache.spark.sql.Row]
的类来流式传输这些数据。以下是我如何尝试写入数据:

def writeToDb2(spark: SparkSession, df: DataFrame): Unit = {
    val writer = new JDBCSink(url , user , password)

    val query= df.writeStream
        .foreach(writer)
        .outputMode("append")
        .trigger(Trigger.ProcessingTime(2000))
        .start()

    query.awaitTermination()
}
这就是我的
JDBCSink
的样子:

class JDBCSink(url: String, user:String, pwd:String) extends org.apache.spark.sql.ForeachWriter[org.apache.spark.sql.Row]{
    val driver = "com.ibm.db2.jcc.DB2Driver"
    var connection:java.sql.Connection = _
    var statement:java.sql.Statement = _

    val schema = "SPARK"
    val rawTableName = "RAW_WEATHER_DATA"
    val dailyPrecipitationTable = "DAILY_PRECIPITATION_TABLE"

    def open(partitionId: Long, version: Long):Boolean = {
        Class.forName(driver)
        connection = java.sql.DriverManager.getConnection(url, user, pwd)
        statement = connection.createStatement
        true
    }

    def process(valz: org.apache.spark.sql.Row): Unit = {
        val value = valz(0).toString.split(",")
        val stmt = s"INSERT INTO $schema.$rawTableName(wsid, year, month, day, hour, temperature, dewpoint, pressure, wind_direction, wind_speed, sky_condition, one_hour_precip, six_hour_precip) " +
            "VALUES (" +
            "'" + value(0) + "'," +
            value(1) + "," +
            value(2) + "," +
            value(3) + "," +
            value(4) + "," +
            value(5) + "," +
            value(6) + "," +
            value(7) + "," +
            value(8) + "," +
            value(9) + "," +
            value(10) + "," +
            value(11) + "," +
            value(12) + ")"
        println(value(1) + "," + value(2) + "," + value(3) + "," + value(4) + "," + value(11))

        statement.executeUpdate(stmt)
    }

    def close(errorOrNull:Throwable):Unit = {
        connection.close()
    }
}
问题是,当我将数据发送到流时,spark不会读取所有行。当我看到程序试图编写的代码时,这一点就变得很清楚了。当我在表中执行
COUNT(*)
时,它不会写入表中的所有8784行。在程序的某些迭代中,写入的行数徘徊在7000行左右,有时是7900行,等等,即它不会写入所有行


背后的原因可能是什么?我遵循了结构化流媒体指南。此外,我还尝试使用各种其他触发器运行,但都没有效果。

似乎对我有好处。进程中没有异常处理。您在日志中是否发现任何异常?以Reming行为例,尝试在jdbc程序中插入相同的数据。你可能理解真正的原因。我认为它们是坏唱片。嗨,它们肯定不是坏唱片。我可以在另一个程序上正确地映射和减少对数据源的操作。我也没有在Spark Master Logs中发现任何奇怪的东西,需要更多的调试。缩小问题的范围。计算每一步的行数,并将期望值与实际值进行比较。是否每行编译insert语句?可能重复?没有重复。但是在任何情况下,spark都应该能够从流中读取数据,对吗?Spark不会读取所有行。这就是问题所在。我应该说清楚的。对不起,看来对我有好处。进程中没有异常处理。您在日志中是否发现任何异常?以Reming行为例,尝试在jdbc程序中插入相同的数据。你可能理解真正的原因。我认为它们是坏唱片。嗨,它们肯定不是坏唱片。我可以在另一个程序上正确地映射和减少对数据源的操作。我也没有在Spark Master Logs中发现任何奇怪的东西,需要更多的调试。缩小问题的范围。计算每一步的行数,并将期望值与实际值进行比较。是否每行编译insert语句?可能重复?没有重复。但是在任何情况下,spark都应该能够从流中读取数据,对吗?Spark不会读取所有行。这就是问题所在。我应该说清楚的。很抱歉