How to restore RDD of (key,value) pairs after it h

2020-02-12 09:46发布

问题:

I saved my RDD of (key, value) pairs to a text file using saveAsTextFile. After I read the text file back using sc.textFile("filename.txt") command, I ended up with strings, instead of (key, value) pairs. My keys used to be strings and values were lists of floats. Here's an example:

(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])  

How do I easily convert this string to (key, value) pair? Is there Spark read command that will do it on read?

I am using Python interface to Spark.

回答1:

ast.literal_eval should do the trick:

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)

but generally speaking it is better to avoid situation like this in the first place and use for example a SequenceFile:

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


回答2:

You're going to have to implement a parser for your input. The easiest thing to do is to map your output to a character separated output with a tab or colon delimeter and use spilt(delimiter) in your map upon reading, basically like in the wordCount example.