来自kafka的火花流聚合

时间:2018-04-18 08:57:43

标签: apache-spark spark-dataframe spark-structured-streaming

我有来自物联网设备的数据流。每个设备都有设备ID和一些指标。我需要在固定时间间隔的每个窗口中计算设备ID上的那些度量的最小值,最大值,平均值。并且我需要为每个上面的窗口时间保持最小,最大,平均聚合。如果当天更改那些min,max,avgs应该重置为当天。每个窗口间隔中都会发生这种情况。我需要在每个窗口中将这些valuse写入kafka流主题。

例如:有一个学生ID流及其标记。我需要在窗口中计算学生ID的最小值,最大值,平均值。我需要将它们保存在数据帧中。在每个窗口中都会发生min,max,avg shulud的计算。我需要在每个窗口中将这些valuse写入kafka流主题。一旦Day chanes持续存在的值需要重置。

对于这种情况,我可以使用Spark结构化流式传输或Dstreaming。如果是这样,请让我知道完成这项工作的程序。

1 个答案:

答案 0 :(得分:0)

每个窗口都基于持续时间。在spark中,每个窗口都被抽象为DStream,只有RDD's的集合。

您可以将RDD转换为数据集/数据帧,然后使用SparkSession执行查询。

例如,你可以这样做

JavaPairInputDStream<String, String> directKafkaStream = KafkaUtils.createDirectStream(ssc, String.class,
                        String.class, StringDecoder.class, StringDecoder.class, kafkaParams, topics);

JavaDStream<String> invStream = directKafkaStream.map(rdd -> {
        logger.info("Input JSON String ------->" + rdd._2);
        System.out.println("Input JSON String ------->" + rdd._2);
        return rdd._2;
});

invStream.foreachRDD(invrdd -> {
    Dataset<Row> inputDataset = sparkSession.read().json(invrdd);
    inputDataset.createOrReplaceTempView("temptable");
    sparkSession.sql("/write your query");
});