我已经用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
答案 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()