2015-10-08 1 views
4

Я сохранил пары RDD (ключ, значение) в текстовом файле, используя saveAsTextFile. После того, как я прочитал текстовый файл с помощью команды sc.textFile("filename.txt"), я столкнулся со строками вместо пар (ключ, значение). Моими ключами были строки и значения, были списки поплавков. Вот пример:Как восстановить RDD пар (ключ, значение) после того, как он был сохранен/прочитан из текстового файла

(u'ALM_0', [98.0, 110.0, 104.0, 6.0, 208.0, -262.0, 136.0, -204.67395833333333, 45.362440283766297, -196487.0, 1.0, 4.0, 2.5, 1.1180339887498949, 10.0, -46.0, 261.0, -3.6343749999999999]) 

Как легко преобразовать эту строку в пару (ключ, значение)? Есть ли команда чтения Spark, которая будет делать это при чтении?

Я использую интерфейс Python для Spark.

ответ

6

ast.literal_eval должен сделать трюк:

import ast 

data1 = [(u'BAR_0', [1.0, 2.0, 3.0]), (u'FOO_1', [4.0, 5.0, 6.0])] 
rdd = sc.parallelize(data1) 
rdd.saveAsTextFile("foobar_text") 

data2 = sc.textFile("foobar_text").map(ast.literal_eval).collect() 
assert sorted(data1) == sorted(data2) 

, но вообще говоря, лучше избегать ситуации, как это в первую очередь и использовать, например, SequenceFile:

rdd.saveAsPickleFile("foobar_seq") 
sc.pickleFile("foobar_seq") 
1

Вам понадобится реализовать парсер для ввода. Самое простое - отобразить свой вывод на выходе с символом, разделенным разделителем табуляции или двоеточия, и использовать пролитый (разделитель) на карте при чтении, в основном, как в примере wordCount.

+0

Было бы справедливо в общем случае, особенно в Scala, но в Python, пока 'unicode' возвращает однозначное и анализируемое представление, на самом деле это довольно просто. – zero323

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