如何使用spark-sql从kafka读取和处理JSON事件?

时间:2018-05-28 06:27:24

标签: json scala apache-spark apache-kafka spark-streaming

详细说明:希望使用结构化的火花流实现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的反序列化问题。 我的问题如上所述是不同的。如果我的问题不清楚,请具体询问,我会进一步澄清。谢谢。

1 个答案:

答案 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()