我能够在PySpark中通过两个不同的步骤从Kafka主题读取流,并将(转换后的)数据写回到另一个Kafka主题。这样做的代码如下:
# Define Stream:
df = spark \
.readStream \
.format("kafka") \
.option("kafka.bootstrap.servers", "localhost:9092") \
.option("subscribe", "instream") \
.load()
# Transform
matchdata = df.select(from_json(F.col("value").cast("string"),schema).alias("value"))\
.select(F.col('value').cast("string"))
# Stream the data, from a Kafka topic to a Spark in-memory table
query = matchdata \
.writeStream \
.format("memory") \
.queryName("PositionTable") \
.outputMode("append") \
.start()
query.awaitTermination(5)
# Create a new dataframe after stream completes:
tmp_df=spark.sql("select * from PositionTable")
# Write data to a different Kafka topic
tmp_df \
.write \
.format("kafka") \
.option("kafka.bootstrap.servers", "localhost:9092") \
.option("topic", "outstream") \
.save()
上面的代码按预期工作:在PySpark中读取Kafka主题“ instream”中的数据,然后PySpark可以将数据写出到Kafka主题“ outstream”。
但是,我想读入流并立即将转换后的数据写回(流将是无限的,并且我们希望在数据滚入时立即获得见解)。在the documentation之后,我将以下查询替换为以下内容:
query = matchdata \
.writeStream \
.format("kafka") \
.option("kafka.bootstrap.servers", "localhost:9092") \
.option("topic", "outstream") \
.option("checkpointLocation", "/path/to/HDFS/dir") \
.start()
这似乎不起作用。 没有错误信息,所以我不知道出了什么问题。我也尝试过在Windows中进行窗口化和聚合,但这也不起作用。任何建议将被认真考虑!
答案 0 :(得分:0)
好的,我发现了问题。主要原因是子目录“ path / to / HDFS / dir”必须存在。创建该目录后,代码按预期运行。如果错误消息指出了这些内容,那就太好了。