withWatermark()
を使用しているにもかかわらず、sparkジョブを実行すると、次のエラーメッセージが表示されます。
スレッド「main」の例外org.Apache.spark.sql.AnalysisException:ウォーターマークのないストリーミングDataFrames/DataSetsにストリーミング集計がある場合、出力モードを追加することはサポートされていません。
プログラミングガイド でわかることから、これは意図された使用法(およびサンプルコード)と完全に一致します。誰かが何が間違っているのか知っていますか?
前もって感謝します!
関連コード(Java 8、Spark 2.2.0):
StructType logSchema = new StructType()
.add("timestamp", TimestampType)
.add("key", IntegerType)
.add("val", IntegerType);
Dataset<Row> kafka = spark
.readStream()
.format("kafka")
.option("kafka.bootstrap.servers", brokers)
.option("subscribe", topics)
.load();
Dataset<Row> parsed = kafka
.select(from_json(col("value").cast("string"), logSchema).alias("parsed_value"))
.select("parsed_value.*");
Dataset<Row> tenSecondCounts = parsed
.withWatermark("timestamp", "10 minutes")
.groupBy(
parsed.col("key"),
window(parsed.col("timestamp"), "1 day"))
.count();
StreamingQuery query = tenSecondCounts
.writeStream()
.trigger(Trigger.ProcessingTime("10 seconds"))
.outputMode("append")
.format("console")
.option("truncate", false)
.start();
問題は_parsed.col
_にあります。 col
に置き換えると、問題が修正されます。 _Dataset.col
_の代わりに常にcol
関数を使用することをお勧めします。
_Dataset.col
_は_resolved column
_を返し、col
は_unresolved column
_を返します。
parsed.withWatermark("timestamp", "10 minutes")
は、同じ名前の新しい列を持つ新しいデータセットを作成します。透かし情報は、parsed.col("timestamp")
ではなく新しいデータセットのtimestamp
列に添付されるため、groupBy
の列には透かしがありません。
未解決の列を使用する場合、Sparkが正しい列を特定します。