簡體   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