簡體   English   中英

Pyspark 結構化流處理

[英]Pyspark Structured streaming processing

我正在嘗試使用 spark 制作一個結構化的流應用程序,主要思想是從 kafka 源讀取,處理輸入,寫回另一個主題。 我已經成功地對 kafka 進行了 spark 讀寫,但是我的問題出在處理部分。 我已經嘗試使用 foreach 函數來捕獲每一行並在寫回 kafka 之前處理它,但是它總是只執行 foreach 部分並且從不寫回 kafka。 但是,如果我從寫入流中刪除 foreach 部分,它將繼續寫入,但現在我丟失了處理。

如果有人能給我一個關於如何用一個例子來做到這一點的例子,我將非常感激。

這是我的代碼

spark = SparkSession \
.builder \
.appName("StructuredStreamingTrial") \
.getOrCreate()
df = spark \
  .readStream \
  .format("kafka") \
  .option("kafka.bootstrap.servers", "localhost:9092") \
  .option("subscribe", "KafkaStreamingSource") \
  .load()

ds = df \
  .selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")\
  .writeStream \
  .outputMode("update") \
  .format("kafka") \
  .option("kafka.bootstrap.servers", "localhost:9092") \
  .option("topic", "StreamSink") \
  .option("checkpointLocation", "./testdir")\
  .foreach(foreach_function)
  .start().awaitTermination()

foreach_function就是

def foreach_function(df):
    try:
        print(df)
    except:
        print('fail')
    pass 

在基於 Pyspark 的 Structured Streaming API 中對寫入 Kafka sink 之前的數據進行處理,我們可以使用 UDF 函數輕松處理任何類型的復雜轉換。

示例代碼在下面。 這段代碼試圖讀取 JSON 格式的消息 Kafka 主題並解析該消息以將消息從 JSON 轉換為 CSV 格式並重寫為另一個主題。 您可以處理任何處理轉換來代替 'json_formatted' 函數。

from pyspark.sql import SparkSession
from pyspark.sql.functions import *
from pyspark.sql.types import *
from pyspark.streaming import StreamingContext
from pyspark.sql.column import Column, _to_java_column
from pyspark.sql.functions import col, struct
from pyspark.sql.functions import udf
import json
import csv
import time
import os

#  Spark Streaming context :

spark = SparkSession.builder.appName('pda_inst_monitor_status_update').getOrCreate()
sc = spark.sparkContext
ssc = StreamingContext(sc, 20)


#  Creating  readstream DataFrame :

df = spark \
  .readStream \
  .format("kafka") \
  .option("kafka.bootstrap.servers", "localhost:9092") \
  .option("subscribe", "KafkaStreamingSource") \
  .load()

df1 = df.selectExpr( "CAST(value AS STRING)")

df1.registerTempTable("test")


def json_formatted(s):
    val_dict = json.loads(s)
    return str([
                    val_dict["after"]["ID"]
                ,   val_dict["after"]["INST_NAME"]
                ,   val_dict["after"]["DB_UNIQUE_NAME"]
                ,   val_dict["after"]["DBNAME"]
                ,   val_dict["after"]["MON_START_TIME"]
                ,   val_dict["after"]["MON_END_TIME"]
                ]).strip('[]').replace("'","").replace('"','')

spark.udf.register("JsonformatterWithPython", json_formatted)

squared_udf = udf(json_formatted)
df1 = spark.table("test")
df2 = df1.select(squared_udf("value"))



#  Declaring the Readstream Schema DataFrame :

df2.coalesce(1).writeStream \
   .writeStream \
   .outputMode("update") \
   .format("kafka") \
   .option("kafka.bootstrap.servers", "localhost:9092") \
   .option("topic", "StreamSink") \
   .option("checkpointLocation", "./testdir")\
   .start()

ssc.awaitTermination()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM