详细说明:希望使用结构化的火花流实现scala代码,DataFrame从Kafka读取JSON事件,并使用spark-sql来操作数据/列并将其写入hive?
使用scala 2.11 / spark 2.2
我知道创建连接是直截了当的:
val df = spark
.readStream
.format("kafka")
.option("kafka.bootstrap.servers", "host1:port1,host2:port2")
.option("subscribe", "topic1")
.load()
df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
.as[(String, String)]
如何处理JSON事件?假设所有事件都具有相同的模式,我是否必须提供模式,如果是这样,它是如何完成的,如果有一种方法可以推断模式是如何完成的?
如果我理解正确,那么我创建一个 tempView ,如何在该视图上运行类似sql的查询?
系统所需的修改:自动系统将此帖标记为重复,不是。在链接的问题中,OP要求用他现有的代码解决问题,并且一个(有效的)答案解决了JSON的反序列化问题。 我的问题如上所述是不同的。如果我的问题不清楚,请具体询问,我会进一步澄清。谢谢。
答案 0 :(得分:0)
假设所有事件都具有相同的架构,我是否必须提供 模式,如果可以的话,如何完成 模式如何完成?
更好的一面,如果您知道架构,请提供一个架构。您可以按如下方式创建模式:
val schema = new StructType().add( "Id",IntegerType).add( "name",StringType)
然后从Kafka读取数据并按以下方式反序列化:
val data_df = df.select(from_json(col("value"), schema).as("data")).select("data.*")
您可以使用data_df创建一个临时视图。
data_df.createOrReplaceTempView("data_df")
现在您可以使用spark sql查询视图
spark.sql("select * from data_df").show()