[英]pySpark Structured Streaming from Kafka does not output to console for debugging
[英]Is there a way to set up structured streaming with pyspark from Kafka to Cassandra
我正在Pyspark中編寫一些分析腳本。 而且我無法設置從Kafka到Cassandra的流式傳輸。 當它是一個數據時就可以了,但是當進行流傳輸時它就行不通了。
我正在閱讀有關foreachBatch
某種方法,但是我是Pyspark的新手,我無法成功寫下來,因為該文檔很documentation腳。
有人可以幫我了解我腳本中的foreachBatch
?
我正在提供從Kafka主題到Cassandra的數據。
import os, json, time
from pyspark.sql import functions as F
from pyspark.sql import types
from pyspark.sql import SparkSession
def parse_value(value):
value_object = json.loads(value)
return [value_object["topicData"]["serialNumber"]+":"+str(value_object["msg"]["params"]["device_id"])+":"+str(value_object["msg"]["timestamp"]),
value_object["msg"]["params"]["service_name"],
str(value_object["msg"]["timestamp"]),
value_object["msg"]["params"]["property_value"]]
parse_value_udf = F.udf(lambda x: parse_value(x), types.ArrayType(types.StringType()))
spark = SparkSession \
.builder \
.appName("StructuredNetworkWordCount") \
.getOrCreate()
spark.sparkContext.setLogLevel("ERROR")
df = spark \
.readStream \
.format("kafka") \
.option("kafka.bootstrap.servers", "localhost:9092") \
.option("subscribe", "topicsForEvents123") \
.load() \
.selectExpr("CAST(value AS STRING)")
df = df.withColumn('_id', parse_value_udf(df.value)[0]).withColumn('property_name', parse_value_udf(df.value)[1]).withColumn('time', parse_value_udf(df.value)[2]).withColumn('value', parse_value_udf(df.value)[3])
df = df.select('_id','property_name','time','value')
query = df \
.writeStream \
.outputMode("append") \
.format("org.apache.spark.sql.cassandra") \
.option("property_change","strat_history_keyspace_cassandra_raw1")\
.start()
query.awaitTermination()
我只是希望有人告訴我舉例foreachBatch
在Pyspark這個劇本,如果它是確定的嘗試。 因為我不了解文檔以及如何用我的代碼來表達它們。
文件說明:
def foreach_batch_function(df, epoch_id):
# Transform and write batchDF
pass
streamingDF.writeStream.foreachBatch(foreach_batch_function).start()
而且我不明白如何發送df
和epoch_id
。 在哪里找到id
,以及將哪個df
發送函數作為參數。
foreachBatch
是一個輸出接收器,可讓您將每個流微批處理作為非流數據幀進行處理。
如果您想嘗試一個最小的工作示例,則可以將數據框打印到控制台:
def foreach_batch_function(df, epoch_id):
df.show()
df.writeStream \
.outputMode("append") \
.foreachBatch(foreach_batch_function) \
.start() \
.awaitTermination()
沒有其他事情可做。
Spark會連續從輸入流(Kafka)中讀取數據,並將每個微型批處理自動發送到您定義的函數( foreach_batch_function
)。 該函數將接收數據框和批次ID。 您不必手動調用該函數。 此時,您可以將數據框視為批處理數據框,並執行所需的所有轉換和操作。
如果要將微批量數據幀輸出到Cassandra,則需要編輯foreach_batch_function
函數,例如
def foreach_batch_function(df, epoch_id):
df.write \
.format("org.apache.spark.sql.cassandra") \
.mode('append') \
.options(table="TABLE_NAME", keyspace="KEYSPACE_NAME") \
.save()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.