/ / Apache Spark - Jak liczyć podobną parę klucz / wartość w sparowanym RDD [zamknięte] - apache-spark, rdd

Apache Spark - Jak zliczyć podobną parę klucz / wartość w sparowanym RDD [zamknięty] - apache-spark, rdd

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 № 1

Moż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)