如何使用pyspark和自定义python函数处理eventhub流

时间:2018-03-19 14:52:52

标签: apache-spark pyspark azure-eventhub

我目前的设置是:

  • Spark 2.3.0 with pyspark 2.2.1
  • 使用Azure IOTHub / EventHub的流媒体服务
  • 基于pandas,matplotlib等的一些自定义python函数

我使用https://github.com/Azure/azure-event-hubs-spark/blob/master/docs/PySpark/structured-streaming-pyspark-jupyter.md作为如何读取数据的示例,但是:

  • 不能使用foreach接收器,因为这没有在python中实现
  • 当我尝试调用.rdd,.map或.flatMap时,我得到一个例外:"必须使用writeStream.start()"
  • 执行带流媒体源的查询

获取流的每个元素并通过python函数传递它的正确方法是什么?

谢谢,

1 个答案:

答案 0 :(得分:1)

第一步,您需要定义一个数据帧,将其作为数据流从EventHub或IoT-Hub读取:

from pyspark.sql.functions import *

df = spark \
  .readStream \
  .format("eventhubs") \
  .options(**ehConf) \
  .load()

数据以二进制形式存储在body属性中。要获取身体的元素,您必须定义结构:

from pyspark.sql.types import *

Schema = StructType([StructField("name", StringType(), True),
                      StructField("dt", LongType(), True),
                      StructField("main", StructType( 
                          [StructField("temp", DoubleType()), 
                           StructField("pressure", DoubleType())])),
                      StructField("coord", StructType( 
                          [StructField("lon", DoubleType()), 
                           StructField("lat", DoubleType())]))
                    ])

,然后将模式应用于强制转换为字符串的正文:

from pyspark.sql.functions import *

rawData = df. \
  selectExpr("cast(Body as string) as json"). \
  select(from_json("json", Schema).alias("data")). \
  select("data.*")

在生成的数据帧上,您可以应用函数,例如。 G。在“名称”列上调用自定义函数u_make_hash:

 parsedData=rawData.select('name', u_make_hash(rawData['name']).alias("namehash"))