【发布时间】:2017-01-23 03:42:43
【问题描述】:
我有一个 Spark 2.0 数据框 example,其结构如下:
id, hour, count
id1, 0, 12
id1, 1, 55
..
id1, 23, 44
id2, 0, 12
id2, 1, 89
..
id2, 23, 34
etc.
每个 id 包含 24 个条目(一天中的每个小时一个),并使用 orderBy 函数按 id、小时排序。
我创建了一个聚合器groupConcat:
def groupConcat(separator: String, columnToConcat: Int) = new Aggregator[Row, String, String] with Serializable {
override def zero: String = ""
override def reduce(b: String, a: Row) = b + separator + a.get(columnToConcat)
override def merge(b1: String, b2: String) = b1 + b2
override def finish(b: String) = b.substring(1)
override def bufferEncoder: Encoder[String] = Encoders.STRING
override def outputEncoder: Encoder[String] = Encoders.STRING
}.toColumn
它帮助我将列连接成字符串以获得这个最终数据帧:
id, hourly_count
id1, 12:55:..:44
id2, 12:89:..:34
etc.
我的问题是,如果我这样做example.orderBy($"id",$"hour").groupBy("id").agg(groupConcat(":",2) as "hourly_count"),这是否保证每小时计数将在各自的存储桶中正确排序?
我读到 RDD 不一定是这种情况(请参阅Spark sort by key and then group by to get ordered iterable?),但 DataFrames 可能不同?
如果没有,我该如何解决?
【问题讨论】:
标签: scala apache-spark apache-spark-sql spark-streaming spark-dataframe