![](/img/trans.png)
[英]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.