2014-07-01 3 views
9

Я пытаюсь решить следующую проблему, используя pyspark. У меня есть файл на hdfs в формате, который является дампом таблицы поиска.Создание большого словаря в pyspark

key1, value1 
key2, value2 
... 

Я хочу загрузить это в словарь python в pyspark и использовать его для других целей. Поэтому я пытался:

table = {} 
def populateDict(line): 
    (k,v) = line.split(",", 1) 
    table[k] = v 

kvfile = sc.textFile("pathtofile") 
kvfile.foreach(populateDict) 

Я обнаружил, что переменная таблицы не изменяется. Итак, есть ли способ создать большую искупительную хэш-таблицу в искры?

ответ

4

foreach - это распределенное вычисление, поэтому вы не можете ожидать, что он изменит структуру данных, видимую только в драйвере. Что вам нужно.

kv.map(line => { line.split(" ") match { 
    case Array(k,v) => (k,v) 
    case _ => ("","") 
}.collectAsMap() 

Это в Скале, но вы получите идею, важная функция collectAsMap(), которая возвращает карту к водителю.

Если данные очень большие, вы можете использовать PairRDD в качестве карты. Первая карта для пар

kv.map(line => { line.split(" ") match { 
     case Array(k,v) => (k,v) 
     case _ => ("","") 
    } 

, то вы можете получить доступ с rdd.lookup("key"), который возвращает последовательность значений, связанные с ключом, хотя это, безусловно, не будет столь же эффективным, как и другими распределенными КВ хранилища, как искра на самом деле не построена что.

+0

Прохладный спасибо. Означает ли это, что карта должна соответствовать памяти водителя? Или он все еще распространяется? – Kamal

+0

@ Камаль, да, он должен соответствовать в мп. U может использовать пару rdd в качестве таблицы поиска. Также подумал о решении с аккумулируемым, скоро опубликует – aaronman

+0

Хорошо. Я искал распределенную карту в искры. Похоже, это невозможно! – Kamal

1

Для повышения эффективности, см: sortByKey() and lookup()

подстановок (ключ):

возвращать список значений в РДУ для ключа ключа. Эта операция выполняется эффективно, если RDD имеет известный разделитель, только просматривая раздел, к которому привязан ключ.

ДРР будет вновь разделены sortByKey() (see: OrderedRDD) и эффективно поиск во lookup() вызовов. В коде, что-то вроде,

kvfile = sc.textFile("pathtofile") 
sorted_kv = kvfile.flatMap(lambda x: x.split("," , 1)).sortByKey() 

sorted_kv.lookup('key1').take(10) 

будет делать трюк как RDD, так и эффективно.

Смежные вопросы