web-dev-qa-db-ja.com

Spark構造化ストリーミングでの複数の集約

Spark構造化ストリーミングで複数の集計を行いたいと思います。

このようなもの:

  • 入力ファイルのストリームを(フォルダーから)読み取ります
  • 集約1を実行します(いくつかの変換を使用)
  • 集計2(およびその他の変換)を実行する

これを構造化ストリーミングで実行すると、「複数のストリーミング集計はストリーミングDataFrames/Datasetsではサポートされていません」というエラーが表示されます。

構造化ストリーミングでこのような複数の集計を行う方法はありますか?

16
Kaptrain

これはサポートされていませんが、他の方法もあります。単一の集計を実行し、それをカフカに保存するようなものです。 kafkaから読み、再度集計を適用します。これは私にとってはうまくいきました。

9
Mahesh Chand

あなたはコードを提供しなかったので、私は 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でグループ化し、集計関数countsumおよびbalance

grouped = csvDF.groupBy("name").agg(F.count("name"), F.sum("age"), F.avg("age"))
1
memoricab

Spark構造化ストリーミングは、Spark 2.4の時点ではサポートされていません。これをサポートすることは、特に、集約以降の「更新」モードでのイベント時間では注意が必要です。出力はイベントが遅くなると変わる可能性がありますが、「追加」モードでこれをサポートするのは非常に簡単ですが、sparkはまだ真の透かしをサポートしていません。

「追加」モードで追加するための提案- https://github.com/Apache/spark/pull/23576

興味があれば、PRを見て投票を投稿してください。

1
arunmahadevan

spark構造化ストリーミング2.4.5以降、ステートレス処理では複数の集約がサポートされていませんが、ステートフル処理が必要な場合は複数回集約することが可能です。

追加モードでは、グループ化されたデータセット(flatMapGroupWithState AP​​Iを使用して取得)でgroupByKeyAPIを複数回使用できます。

0
Suhas NM

構造化ストリーミングAPIはまだ実験段階であるため、これはSpark 2.0ではサポートされていません。現在のすべての制限のリストを確認するには、 ここ を参照してください。

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   
0
ggeop

spark 2.2以降(以前のバージョンについては不明)の場合、flatMapGroupWithStateを使用するように集計を設計できる場合appendモードでは、必要な数の集計を実行できます。制限については、ここで説明します Spark構造化ストリーミング-出力モード

0
Duc PT