Spark Streaming MQTT - 在数据集上应用模式

时间:2016-10-19 09:06:57

标签: json apache-spark streaming mqtt

我正在使用DataBricks(Spark 2.0.1-db1(Scala 2.11)),我正在尝试使用Spark Streaming功能。我正在使用这些库:
- spark-sql-streaming-mqtt_2.11-2.1.0-SNAPSHOT.jar(见这里:http://bahir.apache.org/docs/spark/current/spark-sql-streaming-mqtt/

以下命令为我提供了一个数据集:

val lines = spark.readStream  
      .format("org.apache.bahir.sql.streaming.mqtt.MQTTStreamSourceProvider")  
      .option("clientId", "sparkTest")  
      .option("brokerUrl", "tcp://xxx.xxx.xxx.xxx:xxx")  
      .option("topic", "/Name/data")  
      .option("localStorage", "dbfs:/models/mqttPersist")  
      .option("cleanSession", "true")  
      .load().as[(String, Timestamp)]  

使用此printSchema:

root  
 |-- value : string (nullable : true)  
 |-- timestamp : timestamp (nullable : true)  

我想在我的数据集的“值”列上应用模式。你可以看到我的json架构如下。

root  
 |-- id : string (nullable = true)  
 |-- DateTime : timestamp (nullable = true)  
 |-- label : double (nullable = true)  

是否可以直接在流中解析我的json以获得类似的内容:

root   
 |-- value : struct (nullable : true)  
   |-- id : string (nullable = true)  
   |-- DateTime : timestamp (nullable = true)  
   |-- label : double (nullable = true)  
 |-- timestamp : timestamp (nullable : true)  

目前,我没有看到任何方法从mqtt解析json,任何帮助都会非常棒。

提前致谢。

1 个答案:

答案 0 :(得分:1)

今天我遇到了同样的问题!我用json4s和Jackson来解析json。

我如何获取流式数据集(与您拥有的几乎相同):

 val lines = spark.readStream
   .format("org.apache.bahir.sql.streaming.mqtt.MQTTStreamSourceProvider")
   .option("topic", topic)
   .option("brokerUrl",brokerUrl)
   .load().as[(String,Timestamp)]

我使用案例类定义了架构:

  case class  DeviceData(devicename: String, time: Long, metric: String, value: Long, unit: String)

使用org.json4s.jackson.JsonMethods.parse解析JSON列:

val ds = lines.map {
  row =>
    implicit val format = DefaultFormats
    parse(row._1).extract[DeviceData]
}

输出结果:

val query = ds.writeStream
  .format("console")
  .option("truncate", false)
  .start()

结果:

+----------+-------------+-----------+-----+----+
|devicename|time         |metric     |value|unit|
+----------+-------------+-----------+-----+----+
|dht11_4   |1486656575772|temperature|9    |C   |
|dht11_4   |1486656575772|humidity   |36   |%   |
+----------+-------------+-----------+-----+----+

我有点失望我无法想出一个使用Sparks本机json解析的解决方案。相反,我们必须依靠杰克逊。如果要将文件作为流读取,则可以使用spark native json解析。如此:

val lines = spark.readStream
  .....
  .json("./path/to/file").as[(String,Timestamp)]

但对于MQTT,我们不能这样做。