Как уменьшить на два ключа в стриме искры? - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть следующий тип данных, поступающих от потребителя Kafka

(u'0:l1', ({u'partyField': u'0:n5m, u'attr1': u'ok'})
(u'0:l1', ({u'partyField': u'0:n8m, u'attr1': u'ok'})
(u'0:l1', ({u'partyField': u'0:n8m, u'attr1': u'ok'})

Я бы хотел выполнить операцию reduceByKey на этом. В настоящее время я получаю следующий вывод

(u'0:l1', {u'partyField': u'0:n5m, u'attr1': u'ok'}, 
{u'partyField': u'0:n8m, u'attr1': u'ok'}, 
{u'partyField': u'0:n8m, u'attr1': u'ok'})

Но мне бы хотелось иметь какую-то комбинацию клавиш, так как я бы хотел сгруппировать еще один параметр, который является частью значения, т.е. partyField

Я ищу группировку, похожую на эту, то есть сгруппированную по ключу, а также partyField

(u'0:l1', ({u'partyField': u'0:n5m, u'attr1': u'ok'})

(u'0:l1', {u'partyField': u'0:n8m, u'attr1': u'ok'},
u'0:l1', {u'partyField': u'0:n8m, u'attr1': u'ok'})

Как я могу выполнить эту операцию в свече?

1 Ответ

0 голосов
/ 08 ноября 2018

Сформируйте ключ на основе partyField каждой записи, примените reduceByKey и извлеките значения из reduced_rdd.

Например:

>>> in_rdd = sc.parallelize(a)
[('0:l1', {'partyField': '0:n5m', 'attr1': 'ok'}),
 ('0:l1', {'partyField': '0:n8m', 'attr1': 'ok'}),
 ('0:l1', {'partyField': '0:n8m', 'attr1': 'ok'})]
>>> key_rdd = in_rdd.map(lambda x : (x[1]['partyField'],x))
>>> reduced_rdd = key_rdd.reduceByKey(lambda acc, curr: acc + curr)
>>> final_rdd = reduced_rdd.map(lambda x: x[1])
>>> final_rdd.collect()
[('0:l1',{'partyField': '0:n8m', 'attr1': 'ok'}, 
  '0:l1',{'partyField': '0:n8m', 'attr1': 'ok'}),

 ('0:l1',{'partyField': '0:n5m', 'attr1': 'ok'})]

Надеюсь, это поможет!

...