2015-07-07 2 views
0

У меня есть файл, как это:питона MapReduce конвертировать текст в массив

0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 1,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 2,1,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 3,1,1,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 4,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

И я хочу, чтобы сделать первый элемент, ключ и деталь остальной его значение, массив из них. Мой код работы это не распространяется:

mRDD = rRDD.map(lambda line: (line[0], (np.array(int(line))))).collect() 

Мой желаемый результат:

(3, (1,1,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)) 

(4, (1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)) 

Мой последний подход:

import os.path 
import numpy as np 
baseDir = os.path.join('data') 
inputPath = os.path.join('mydata', 'matriz_reglas_test.csv') 
fileName = os.path.join(baseDir, inputPath) 

reglasRDD = (sc.textFile(fileName, 8) 
       .cache() 
      ) 
regRDD = reglasRDD.map(lambda line: line.split('\n')) 
print regRDD.take(5) 

movRDD = regRDD.map(lambda line: (line[0], (int(x) for x in line[1:] if x))).collect() 
print movRDD.take(5) 

И ошибка:

PicklingError: Can't pickle <type 'generator'>: attribute lookup __builtin__.generator failed 

Любая помощь оценили.

ответ

1

Наконец у меня есть решение:

import os.path 
    import numpy as np 
    baseDir = os.path.join('data') 
    inputPath = os.path.join('mydata', 'matriz_reglas_test.csv') 
    fileName = os.path.join(baseDir, inputPath)  
    split_regex = r'\W+' 

    def tokenize(string): 
     """ An implementation of input string tokenization 
     Args: 
      string (str): input string 
     Returns: 
      list: a list of tokens 
     """ 
     s = re.split(split_regex, string) 
     return [int(word) for word in s if word] 


    reglasRDD = (sc.textFile(fileName, 8) 
        .map(tokenize) 
        .cache() 
       ) 

    movRDD = reglasRDD.map(lambda line: (line[0], (line[1:]))) 
    print movRDD.take(5) 

Выход:

[(0, [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (1, [1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (2, [1, 1, 0, 0, 0, 0, 0, 0, 0]), (3, [1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), (4, [1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])]

Спасибо!

0

Я не уверен в части rRDD.map().collect(), но вы можете легко прочитать в файле np.genfromtxt() и использовать определение dict для отображения.

data_array = np.genfromtxt('data.csv', delimiter=',') 
data_dict = {first:rest for first, *rest in data_array} 

Цикл for будет итерации по строкам массива (каждая строка файла). Распаковка используется для назначения первого элемента first, а остальная часть строки - rest. Обратите внимание, что это новое в Python 3! При использовании Python 2, вы можете немного изменить Dict понимание:

data_dict = {row[0]:row[1:] for row in data_array} 
+0

RDD.map(). Collect() часть предназначена для распараллеливания с помощью Spark. Реальный файл данных намного больше. – jag

+0

Я вижу. Подумайте, почему ваш код выше не работает? Какая у вас ошибка? Или вы просто не получаете то, что хотите, и если да, то что вы получаете? Это может помочь вам получить больше ответов. – Kreger51

0

The (неоптимизированная) ниже код может получить Вас на правильном пути:

with open("tmp.txt", "r") as f: 
    for line in f: 
     line = line.strip() 
     first = int(line[0]) 
     rest = line[1:].split(",") 
     rest = tuple([int(x) for x in rest if x]) 
     tup = (first,(rest)) 
     print tup 
Смежные вопросы