Spark構造化ストリーミングで複数の集計を行いたいと思います。
このようなもの:
これを構造化ストリーミングで実行すると、「複数のストリーミング集計はストリーミングDataFrames/Datasetsではサポートされていません」というエラーが表示されます。
構造化ストリーミングでこのような複数の集計を行う方法はありますか?
これはサポートされていませんが、他の方法もあります。単一の集計を実行し、それをカフカに保存するようなものです。 kafkaから読み、再度集計を適用します。これは私にとってはうまくいきました。
あなたはコードを提供しなかったので、私は here を参照するコード例を使用します。
以下がDFを使用するための初期コードであるとします。
import pyspark.sql.functions as F
spark = SparkSession. ...
# Read text from socket
socketDF = spark \
.readStream \
.format("socket") \
.option("Host", "localhost") \
.option("port", 9999) \
.load()
socketDF.isStreaming() # Returns True for DataFrames that have streaming sources
socketDF.printSchema()
# Read all the csv files written atomically in a directory
userSchema = StructType().add("name", "string").add("age", "integer")
csvDF = spark \
.readStream \
.option("sep", ";") \
.schema(userSchema) \
.csv("/path/to/directory") # Equivalent to format("csv").load("/path/to/directory")
ここで、dfをnameでグループ化し、集計関数count、sumおよびbalance。
grouped = csvDF.groupBy("name").agg(F.count("name"), F.sum("age"), F.avg("age"))
Spark構造化ストリーミングは、Spark 2.4の時点ではサポートされていません。これをサポートすることは、特に、集約以降の「更新」モードでのイベント時間では注意が必要です。出力はイベントが遅くなると変わる可能性がありますが、「追加」モードでこれをサポートするのは非常に簡単ですが、sparkはまだ真の透かしをサポートしていません。
「追加」モードで追加するための提案- https://github.com/Apache/spark/pull/23576
興味があれば、PRを見て投票を投稿してください。
spark構造化ストリーミング2.4.5以降、ステートレス処理では複数の集約がサポートされていませんが、ステートフル処理が必要な場合は複数回集約することが可能です。
追加モードでは、グループ化されたデータセット(flatMapGroupWithState
APIを使用して取得)でgroupByKey
APIを複数回使用できます。
構造化ストリーミングAPIはまだ実験段階であるため、これはSpark 2.0ではサポートされていません。現在のすべての制限のリストを確認するには、 ここ を参照してください。
Spark 2.4.4(現時点では最新)は、.foreachBatch()を使用できる複数のストリーミング集約をサポートしていません メソッド
ダミーの例:
query = spark
.readStream
.format('kafka')
.option(..)
.load()
.writeStream
.trigger(processingTime='x seconds')
.outputMode('append')
.foreachBatch(foreach_batch_function)
.start()
query.awaitTermination()
def foreach_batch_function(df, Epoch_id):
# Transformations (many aggregations)
pass
spark 2.2以降(以前のバージョンについては不明)の場合、flatMapGroupWithStateを使用するように集計を設計できる場合appendモードでは、必要な数の集計を実行できます。制限については、ここで説明します Spark構造化ストリーミング-出力モード