时间序列图表:数据为行而不是列

时间:2016-03-29 07:28:07

标签: apache-spark c3.js

我想使用条形图作为可视化,来描述每个日期运行多个应用程序之一的次数(为简单起见,将应用程序视为excel,word,powerpoint等。例如,on 3月15日,如果一个用户打开一次Excel,而Word两次打开,它将为Word显示两个高度,堆叠高度为一个excel等。

可视化显示一年的堆叠数据(365条),其中每个堆叠条对每个程序使用不同的颜色。有20个节目。数据堆叠 - 例如Word(如果描绘)总是在底部,然后是Excel等。

执行此操作的传统方法是使用外连接创建365行,以及20列(Word,Excel等),每天为每列创建一个整数值。这种技术有效,但对数据库计算密集(更不用说密集的SQL),我想知道是否有人知道处理这个问题的时间序列图表工具。 这是一个数据轮换问题:我想要按行提取数据,让图表产品组合条形图。它需要从数据中读取Data Series名称,并在遇到新值时创建新的Data Series。我实际上有数千个可能的程序,但每个图表不太可能需要描绘超过20个。

图表产品应该像这样工作: minDate = 20150101,maxDate = 20151231,interval = Day 然后数据是

20150315 "Word" 1
20150315 "Word" 1
20150315 "Excel" 1
20150316 "Powerpoint" 1
20150316 "Word" 1

或者,每行可以是每个程序每天的总数:

20150315 "Word" 2
20150315 "Excel" 1
20150316 "Powerpoint" 1
20150316 "Word" 1

我正在使用C3,带有火花和scala。我可以使用任何JavaScript库。

1 个答案:

答案 0 :(得分:0)

您要问的是如何将数据从宽格式转换为长格式。在Spark中,您使用DataFrame.explode。假设你有一些看起来像这样的东西:

+--------+----+-----+
|    date|word|excel|
+--------+----+-----+
|20150101|   3|    4|
|20150102|   1|    2|
+--------+----+-----+

你可以用这个重塑它:

df.explode($"word", $"excel"){case row  => 
  Seq(("Word", row.getInt(0)), ("Excel", row.getInt(1)))
}.select($"date", $"_1" as "app", $"_2" as "count")

进入这个:

+--------+-----+-----+
|    date|  app|count|
+--------+-----+-----+
|20150101| word|    3|
|20150101|excel|    4|
|20150102| word|    1|
|20150102|excel|    2|
+--------+-----+-----+