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.
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")
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.