У меня искра 2.0 dataframe example
со следующей структурой:Spark DataFrame: делает groupBy после заказа. Поддерживайте этот заказ?
id, hour, count
id1, 0, 12
id1, 1, 55
..
id1, 23, 44
id2, 0, 12
id2, 1, 89
..
id2, 23, 34
etc.
Он содержит 24 записей для каждого идентификатора (по одному на каждый час дня) и упорядочен идентификатором, час с помощью функции OrderBy.
Я создал агрегатор 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
Это помогает мне конкатенации столбцов в строки, чтобы получить эту последнюю dataframe:
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?
Если нет, то как я могу обойти это?
Есть ли у вас какие-либо ссылки о том, что groupBy поддерживает порядок? Я не мог найти ничего в официальных документах –
У меня нет официальных документов, но у меня есть эта статья, которая объясняет немного лучше механизм https://bzhangusc.wordpress.com/2015/05/28/groupby-on -dataframe-is-not-the-groupby-on-rdd /. Замечания также интересны. – Interfector
Интересно, что даже сам Шон Оуэн утверждает, что заказ не может быть сохранен (https://issues.apache.org/jira/browse/SPARK-16207?focusedCommentId=15356725&page=com.atlassian.jira.plugin.system.issuetabpanels% 3Acomment-tabpanel # comment-15356725) –