簡體   English   中英

如何在Java中的Spark Streaming中解析復雜的JSON數據

[英]How to parse complex JSON Data in spark streaming in Java

我們正在開發物聯網應用

我們從要對其進行分析的每個設備中獲取以下數據流,

[{"t":1481368346000,"sensors":[{"s":"s1","d":"+149.625"},{"s":"s2","d":"+23.062"},{"s":"s3","d":"+16.375"},{"s":"s4","d":"+235.937"},{"s":"s5","d":"+271.437"},{"s":"s6","d":"+265.937"},{"s":"s7","d":"+295.562"},{"s":"s8","d":"+301.687"}]}]

在初級,我能夠使用spark java代碼獲取架構,如下所示:

    root
     |-- sensors: array (nullable = true)
     |    |-- element: struct (containsNull = true)
     |    |    |-- d: string (nullable = true)
     |    |    |-- s: string (nullable = true)
     |-- t: long (nullable = true)

我寫的代碼是

    JavaDStream<String> json = directKafkaStream.map(new Function<Tuple2<String,String>, String>() {
        public String call(Tuple2<String,String> message) throws Exception {
            return message._2();
        };
    });

    SQLContext sqlContext = spark.sqlContext();
    json.foreachRDD(new VoidFunction<JavaRDD<String>>() {
        @Override
        public void call(JavaRDD<String> jsonRecord) throws Exception {

            Dataset<Row> row = sqlContext.read().json(jsonRecord).toDF();
            row.createOrReplaceTempView("MyTable");
            row.printSchema();
            row.show();

            Dataset<Row> sensors = row.select("sensors");
            sensors.createOrReplaceTempView("sensors");
            sensors.printSchema();
            sensors.show();

        }
    });

這給了我一個錯誤,因為“ org.apache.spark.sql.AnalysisException:在給定的輸入列:[];下無法解析' sensors '”

我是Spark和Analytics(分析)的初學者,無法在Java中找到任何解析嵌套json的好示例。

我想要達到的目標是,可能需要這里專家的建議,

我將提取每個傳感器值,然后使用spark的sparkML庫運行回歸分析。 這將有助於我找出每個傳感器流中正在發生的趨勢,以及我想使用該數據來檢測故障。

我不確定哪種方法應該是最好的方法,任何指導,鏈接和信息都將真正有用。

這是json.foreachRDD樣子。

json.foreachRDD(new VoidFunction<JavaRDD<String>>() {
        @Override
        public void call(JavaRDD<String> rdd) {
            if(!rdd.isEmpty()){
                Dataset<Row> data = spark.read().json(rdd).select("sensors");
                data.printSchema();
                data.show(false);
                //DF in table
                Dataset<Row> df = data.select( org.apache.spark.sql.functions.explode(org.apache.spark.sql.functions.col("sensors"))).toDF("sensors").select("sensors.s","sensors.d");
                df.show(false);
            }
        }
    });

對於回歸分析示例,您可以在以下網址引用JavaRandomForestRegressorExample.java

對於使用Spark機器學習和Spark Streaming進行實時數據分析,您可以參考以下文章。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM