我有一个连接到kafka代理并创建名为temp的spark writeStream的Pyspark笔记本。 Kafka主题中的数据值为json格式,但我不确定如何创建一个可以实时解析此数据的spark sql表。我知道的唯一方法是创建表的副本,将其转换为RDD或DF,然后将值解析为另一个RDD和DF。可以在写入流时实时进行处理吗?
代码:
df = spark \
.readStream \
.format("kafka") \
.option("kafka.bootstrap.servers","localhost:9092") \
.option("subscribe","hoteth") \
.option("startingOffsets", "earliest") \
.load()
ds = df.selectExpr("CAST (key AS STRING)", "CAST(value AS STRING)", "timestamp")
ds.writeStream.queryName("temp").format("memory").start()
spark.sql("select * from temp limit 5").show()
输出:
+----+--------------------+--------------------+
| key| value| timestamp|
+----+--------------------+--------------------+
|null|{"e":"trade","E":...|2018-09-18 15:41:...|
|null|{"e":"trade","E":...|2018-09-18 15:41:...|
|null|{"e":"trade","E":...|2018-09-18 15:41:...|
|null|{"e":"trade","E":...|2018-09-18 15:41:...|
|null|{"e":"trade","E":...|2018-09-18 15:41:...|
+----+--------------------+--------------------+
答案 0 :(得分:0)
我可以解决此问题的一种方法是像在Hive HQL中一样,仅横向查看json_tuple。我仍在寻找一种解决方案,该解决方案可以直接从流中解析数据,从而不会花费额外的处理时间来使用查询进行解析。
spark.sql("""
select value, v1.transaction,ticker,price
from temp
lateral view json_tuple(value,"e","s","p") v1 as transaction, ticker,price
limit 5
""").show()