mam iskrę 2,0 dataframe example
o następującej strukturze:Spark DataFrame: czy groupBy po zamówieniu Czy utrzymujesz tę kolejność?
id, hour, count
id1, 0, 12
id1, 1, 55
..
id1, 23, 44
id2, 0, 12
id2, 1, 89
..
id2, 23, 34
etc.
24 zawiera dane dla każdego identyfikatora (po jednej dla każdej porze dnia) i jest sortowana według id godzinę przy użyciu funkcji orderby.
Stworzyłem agregatora 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
Pomaga mi złączyć kolumny do strun do uzyskania tej ostatecznej dataframe:
id, hourly_count
id1, 12:55:..:44
id2, 12:89:..:34
etc.
Moje pytanie brzmi, czy mogę zrobić example.orderBy($"id",$"hour").groupBy("id").agg(groupConcat(":",2) as "hourly_count")
, czy to gwarancję czy liczniki godzinowe zostaną prawidłowo zamówione w odpowiednich zasobnikach?
Przeczytałem, że nie jest to konieczne w przypadku RDD (patrz Spark sort by key and then group by to get ordered iterable?), ale może jest inaczej w DataFrames?
Jeśli nie, jak mogę obejść ten problem?
Czy masz jakieś referencje stwierdzające, że groupBy utrzymuje kolejność? Nie mogłem znaleźć niczego w oficjalnych dokumentach. –
Nie mam oficjalnych dokumentów, ale mam ten artykuł, który wyjaśnia nieco lepszy mechanizm https://bzhangusc.wordpress.com/2015/05/28/groupby-on -dataframe-is-not-the-groupby-on-rdd /. Komentarze również są interesujące. – Interfector
Co ciekawe, nawet sam Sean Owen twierdzi, że zamówienie może nie zostać zachowane (https://issues.apache.org/jira/browse/SPARK-16207?focusedCommentId=15356725&page=com.atlassian.jira.plugin.system.issuetabpanels% 3Acomment-tabpanel # comment-15356725) –