Если вы хотите сделать reduceByKey, где тип в приведенных парах KV отличается от типа исходных пар KV, то можно использовать функцию combineByKey
. То, что делает функция, - это взять пары KV и объединить их (по Key) в пары KC, где C - это другой тип, чем V.
В одном задаются 3 функции, createCombiner, mergeValue, mergeCombiners. Первый указывает, как преобразовать тип V в тип C, второй описывает, как объединить тип C с типом V, а последний указывает, как объединить тип C с другим типом C. Мой код создает пары KV:
Определите 3 функции следующим образом:
def Combiner(a): #Turns value a (a tuple) into a list of a single tuple.
return [a]
def MergeValue(a, b): #a is the new type [(,), (,), ..., (,)] and b is the old type (,)
a.extend([b])
return a
def MergeCombiners(a, b): #a is the new type [(,),...,(,)] and so is b, combine them
a.extend(b)
return a
Затем My_KMV = My_KV.combineByKey(Combiner, MergeValue, MergeCombiners)
Лучший ресурс, который я нашел при использовании этой функции: http://abshinn.github.io/python/apache-spark/2014/10/11/using-combinebykey-in-apache-spark/
Как указывали другие, a.append(b)
или a.extend(b)
return None
. Таким образом, reduceByKey(lambda a, b: a.append(b))
возвращает None в первой паре пар KV, а затем не работает во второй паре, потому что None.append (b) терпит неудачу. Вы можете обойти это, указав отдельную функцию:
def My_Extend(a,b):
a.extend(b)
return a
Затем вызовите reduceByKey(lambda a, b: My_Extend(a,b))
(использование лямбда-функции здесь может быть ненужным, но я не проверял этот случай.)
Достаточно следующего:
[^ ]
Если вы хотите развернуть это на все, кроме белого пространства (разрывы строк, вкладки, пробелы, жесткие пространства):
[^\s]
или
\S
\s
соответствует любому символу пробела \S
соответствует любому символу небелого пробела [^ ]
соответствует любому символу пробела. Выберите, что наиболее подходит.
[^\ ]
работал для меня (я избегаю пространства) – Anupam 9 April 2018 в 12:31