如何使用Pyspark从Azure eventhub流数据?

时间:2019-12-04 13:18:48

标签: azure apache-spark pyspark spark-streaming azure-eventhub

我已经用azure创建了一个事件中心,并使用python脚本在同一事件上发布了一些消息。我可以使用另一个python脚本从事件中心获取消息,但无法使用Pyspark传输消息。以下是我用来流式传输消息的Pyspark代码:

connectionString = <MyConnectionString>

ehConf = {
  'eventhubs.connectionString' : connectionString
}

ehConf['eventhubs.consumerGroup'] = "$default"

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

df.writeStream.format("parquet").outputMode("append").option("path", "azure_streaming_test").option("checkpointLocation", "azure_streaming_checkpoint").start()
query.awaitTermination()

通过在Pyspark shell中运行以上代码,我得到以下错误提示:

java.lang.IncompatibleClassChangeError:方法'com.microsoft.azure.eventhubs.EventHubClient com.microsoft.azure.eventhubs.EventHubClient.createSync(java.lang.String,java.util.concurrent.ScheduledExecutorService)'必须是InterfaceMethodref恒定

随附的是错误消息的屏幕截图。

需要纠正什么?提前致谢! Error Message

1 个答案:

答案 0 :(得分:0)

我确实尝试过解决这个问题,下面的代码也很好用。您能告诉我您使用的是哪个版本的Pyspark吗?您找到解决问题的方法了吗?

from pyspark.sql.functions import *

from pyspark.sql.types import *

connectionString = "XX"


ehConf = {

  'eventhubs.connectionString' : connectionString

}

ehConf['eventhubs.consumerGroup'] = "$Default"

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

Schema = StructType([StructField("cardNumber", StringType(), True),

                      StructField("transactionId", StringType(), True),

                      StructField("transactionTime", StringType(), True)                   



                    ])

rawData = df. \

  selectExpr("cast(Body as string) as json"). \

  select(from_json("json", Schema).alias("data")). \

  select("data.*")

parsedData=rawData.select('transactionId','cardNumber','transactionTime')  

display(parsedData)



df.writeStream.format("parquet").outputMode("append").option("path", "/azure_streaming_test").option("checkpointLocation", "/azure_streaming_checkpoint").start()