Mam kilka krotek, które są w postaci złożonych kluczy i wartości. Na przykład,Jak grupować według wielu kluczy w iskrze?
tfile.collect() = [(('id1','pd1','t1'),5.0),
(('id2','pd2','t2'),6.0),
(('id1','pd1','t2'),7.5),
(('id1','pd1','t3'),8.1) ]
Chcę wykonać sql jak operacje na tej kolekcji, gdzie mogę agregacji informacji w oparciu o id [1..n] lub pd [1..n]. Chcę zaimplementować za pomocą wanilii pyspark apis i nie używając SQLContext. W mojej obecnej implementacji czytam z wielu plików i scalania RDD.
def readfile():
fr = range(6,23)
tfile = sc.union([sc.textFile(basepath+str(f)+".txt")
.map(lambda view: set_feature(view,f))
.reduceByKey(lambda a, b: a+b)
for f in fr])
return tfile
Zamierzam utworzyć zagregowaną tablicę jako wartość. Na przykład:
agg_tfile = [((id1,pd1),[5.0,7.5,8.1])]
gdzie 5,0,75,8,1 reprezentuje [t1, t2, t3]. Obecnie osiągam to samo przy użyciu kodu Villa Pythona za pomocą słowników. Działa dobrze dla mniejszych zestawów danych. Ale martwię się, ponieważ może to nie być skalowalne dla większych zestawów danych. Czy istnieje skuteczny sposób osiągnięcia tego samego przy użyciu pyspark apis?
Zamiast ' unii "bardziej wydajne jest ładowanie wszystkich plików z wywołaniem' wholeTextFiles' (jeśli istnieje w PySpark) –
Oto Scala [redukcja agregacji przez multi ple klucze] (http://dmtolpeko.com/2015/02/12/multi-column-key-and-value-reduce--tuple-in-spark/) i Python [union redukcji wielu wartości] (http://stackoverflow.com/questions/30895033/spark-use-reducebykey-instead-of-groupbykey-and-mapbyvalues) – ecoe