繁体   English   中英

有没有办法使用pyspark从Kafka到Cassandra设置结构化流

[英]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()  

而且我不明白如何发送dfepoch_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM