/ / Apache Spark - Як рахувати подібну пару ключів / значень у парному RDD [закрито] - apache-spark, rdd

Apache Spark - Як розрахувати подібну пару ключ / значення в парному RDD [closed] - apache-spark, rdd

я маю rdd типу RDD[(String, String)], Я хочу вихід RDD[(String, String, Int)] де int буде рахуватися подібних наборів. напр .:

RDD введення:

java, perl
.Net, php
java, perl

Вихід RDD:

java, perl, 2
.Net, php, 1

Я спробував додати Int (як 1) в Input RDD, Так що тепер Input RDD стає:

[(String, String, Int)] де Int є 1

Але t.reduceByKey((a,b,c) => (a,b,c)) дає помилку.

Відповіді:

1 для відповіді № 1

Ви можете створити новий ключ, з'єднавши два значення, а потім додати як показ нижче:

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)

Або просто трактуйте весь рядок як "ключ":

lines = sc.parallelize(["java, perl", ".Net, php", "java, perl"])
processed = lines.map(lambda l: (l, 1))
reduced = processed.reduceByKey(lambda a, b: a + b)

Вихід:

>>> lines.collect()
["java, perl", ".Net, php", "java, perl"]
>>> reduced.collect()
[(".Net, php", 1), ("java, perl", 2)]

EDIT:

Ви можете визначити функцію для форматування даних та використання map перетворення:

def formatter(line):
skills = line[0].split()
return skills[0], skills[1], line[1]

threecols = reduced.map(formatter)