Apache Spark可以将几条相似的行合并为一行吗?

时间:2016-08-02 14:51:35

标签: apache-spark spark-streaming

我完全是Apache Spark的新手,因此,如果我的问题似乎很天真,我很抱歉,但我没有在互联网上找到明确的答案。

以下是我的问题的上下文:我想从Apache Kafka服务器检索json输入数据。格式如下:

{"deviceName":"device1", "counter":125}
{"deviceName":"device1", "counter":125}
{"deviceName":"device2", "counter":88}
{"deviceName":"device1", "counter":125}
{"deviceName":"device2", "counter":88}
{"deviceName":"device1", "counter":125}
{"deviceName":"device3", "counter":999}
{"deviceName":"device3", "counter":999}

使用Spark或Spark Streaming,我想处理这些数据并获得以下格式的输出:

{"deviceName":"device1", "counter":125, "nbOfTimes":4}
{"deviceName":"device2", "counter":88, "nbOfTimes":2}
{"deviceName":"device3", "counter":999, "nbOfTimes":2}

所以,我想知道我是否可以使用Spark进行搜索。如果是的话,你能给我一些指导吗?我会非常感激。

1 个答案:

答案 0 :(得分:2)

可以使用Spark和Spark Streaming完成。但是,让我们考虑使用包含数据的json文件的第一种情况。

val df = sqlContext.read.format("json").load("text.json")
// df: org.apache.spark.sql.DataFrame = [counter: bigint, deviceName: string]      

df.show
// +-------+----------+
// |counter|deviceName|
// +-------+----------+
// |    125|   device1|
// |    125|   device1|
// |     88|   device2|
// |    125|   device1|
// |     88|   device2|
// |    125|   device1|
// |    999|   device3|
// |    999|   device3|
// +-------+----------+

df.groupBy("deviceName","counter").count.toDF("deviceName","counter","nbOfTimes").show
// +----------+-------+---------+                                                  
// |deviceName|counter|nbOfTimes|
// +----------+-------+---------+
// |   device1|    125|        4|
// |   device2|     88|        2|
// |   device3|    999|        2|
// +----------+-------+---------+

显然你可以把它写成你想要的任何格式。但我认为你得到了主要的想法。