Создать словарь с длиной слова в качестве ключа и отсортировать слова в качестве значения в искре? - PullRequest
0 голосов
/ 01 июля 2018

Я новичок в Spark и пытаюсь создать словарь следующим образом:

{4: {'aenr': ['earn', 'rane'], 'aerr': ['rare', 'rear'], 'aenw': ['anew', 'wane', 'wean'], 'derw': ['drew']}

По сути, это должна быть структура, использующая искру

{len(word): {sorted(word):[word1,word2,etc]}

У меня есть огромный файл, который содержит английские слова, и структура выглядит следующим образом:

{
  "biennials": 0, 
  "tripolitan": 0, 
  "oblocutor": 0, 
  "leucosyenite": 0, 
  "chilitis": 0, 
  "fabianist": 0, 
  "diazeutic": 0, 
  "alible": 0, 
  "deciet":0
}

Итак, я хочу прочитать файл построчно и создать rdd, который может содержать это:

{len(word): {sorted(word):[word1,word2,etc]}

Я пробовал это:

    r = rdd.map(lambda x: {len(x):sorted(x)})


    items = r.flatMap(lambda line: (line.items()))
    items.take(items.count())
    groupedItems = items.groupByKey().mapValues(list)
    groupedItems.take(groupedItems.count())#j = filter2_rdd


    d = groupedItems.collectAsMap()

Но это печатает следующее:

[
{1: {u'{': [u'{']}},
{9: {u'abeiilnns': [u'  "biennials": 0, ']}}, 
{10: {u'aiilnoprtt': [u'  "tripolitan": 0, ']}}, 
{9: {u'bclooortu': [u'  "oblocutor": 0, ']}}, 
{12: {u'ceeeilnostuy': [u'  "leucosyenite": 0, ']}}, 
{8: {u'chiiilst': [u'  "chilitis": 0, ']}}, 
{9: {u'aabfiinst': [u'  "fabianist": 0, ']}}, 
{9: {u'acdeiituz': [u'  "diazeutic": 0, ']}}, 
{6: {u'abeill': [u'  "alible": 0, ']}}, 
{6: {u'cdeeit': [u'  "deciet":0,']}}, 
{5: {u'doosw': [u'  "woods": 4601, ']}}, 
{14: {u'adeejmnnoprrtu': [u'  "preadjournment": 0, ']}}, 
{7: {u'deiprss': [u'  "spiders": 0, ']}}, 
{9: {u'aabfiimns': [u'  "fabianism": 0, ']}}, 
{11: {u'cdgilnoostu': [u'  "outscolding": 0, ']}}, 
{10: {u'eeilprrsty': [u'  "sperrylite": 0, ']}}, 
{8: {u'agilnrtw': [u'  "trawling": 0, ']}}, 
{13: {u'acdeimmoprrsu': [u'  "cardiospermum": 0, ']}}, 
{10: {u'gghhiilttt': [u'  "lighttight": 0, ']}}, 
{7: {u'deiprsy': [u'  "spidery": 0, ']}}
}

Мне нужно, чтобы они были сгруппированы по длине и по всем словам в списке

1 Ответ

0 голосов
/ 01 июля 2018

Вы не можете сразу map() до len() и sorted(), потому что вы потеряете свое первоначальное значение. Это один из способов сделать это:

  • map для создания ключа sorted(x)
  • groupByKey - sorted(x)
  • map для создания ключа len(x)
  • groupByKey - len(x)
  • collectAsMap()

Вам может потребоваться преобразовать ResultIterable s в определенные типы Python, если вы хотите распечатать его:

например. (при условии, что вы распараллелили все слова в rdd):

In []:
(rdd
 .map(lambda x: (''.join(sorted(x)), x))
 .groupByKey()
 .mapValues(lambda x: list(x))
 .map(lambda x: (len(x[0]), x))
 .groupByKey()
 .mapValues(lambda x: dict(x))
 .collectAsMap())

Out[]:
{6: {'abeill': ['alible'], 'cdeeit': ['deciet']},
 8: {'chiiilst': ['chilitis']},
 9: {'aabfiinst': ['fabianist'],
  'abeiilnns': ['biennials'],
  'acdeiituz': ['diazeutic'],
  'bclooortu': ['oblocutor']},
 10: {'aiilnoprtt': ['tripolitan']},
 12: {'ceeeilnostuy': ['leucosyenite']}}
...