web-dev-qa-db-ja.com

透かし付きの追加出力モードを使用する場合の構造化ストリーミング例外

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();
8
Ray J

問題は_parsed.col_にあります。 colに置き換えると、問題が修正されます。 _Dataset.col_の代わりに常にcol関数を使用することをお勧めします。

_Dataset.col_は_resolved column_を返し、colは_unresolved column_を返します。

parsed.withWatermark("timestamp", "10 minutes")は、同じ名前の新しい列を持つ新しいデータセットを作成します。透かし情報は、parsed.col("timestamp")ではなく新しいデータセットのtimestamp列に添付されるため、groupByの列には透かしがありません。

未解決の列を使用する場合、Sparkが正しい列を特定します。

15
zsxwing