mam rdd
typu RDD[(String, String)]
, Chcę wynik RDD[(String, String, Int)]
gdzie int
będzie liczyć podobne zestawy. na przykład:
Wejściowe RDD:
java, perl
.Net, php
java, perl
Wyjściowy RDD:
java, perl, 2
.Net, php, 1
Próbowałem dodać Int
(jak 1) w Input RDD
, Więc teraz Input RDD
staje się:
[(String, String, Int)]
gdzie Int
jest 1.
Ale t.reduceByKey((a,b,c) => (a,b,c))
daje błąd.
Odpowiedzi:
1 dla odpowiedzi № 1Możesz utworzyć nowy klucz, łącząc dwie wartości, a następnie dodaj jak pokazano poniżej:
lines = sc.parallelize(["java, perl", ".Net, php", "java, perl"])
splitted = lines.map(lambda l: l.split(","))
processed = splitted.map(lambda l: (l[0] + "," + l[1], 1))
reduced = processed.reduceByKey(lambda a, b: a+b)
Lub po prostu traktuj całą linię jako „klucz”:
lines = sc.parallelize(["java, perl", ".Net, php", "java, perl"])
processed = lines.map(lambda l: (l, 1))
reduced = processed.reduceByKey(lambda a, b: a + b)
Wydajność:
>>> lines.collect()
["java, perl", ".Net, php", "java, perl"]
>>> reduced.collect()
[(".Net, php", 1), ("java, perl", 2)]
EDYTOWAĆ:
Możesz zdefiniować funkcję formatowania danych i użyj map
transformacja:
def formatter(line):
skills = line[0].split()
return skills[0], skills[1], line[1]
threecols = reduced.map(formatter)