我使用saveAsTextFile将(键,值)对的RDD保存到文本文件中。使用sc.textFile("filename.txt")命令读回文本文件后,我得到的是字符串而不是(键,值)对。我的键以前是字符串,值是浮点列表。这是一个例子:
sc.textFile("filename.txt")
(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 read命令可以在读取时执行此命令?
我正在使用Python接口连接Spark。
ast.literal_eval 应该做到这一点:
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:
SequenceFile
rdd.saveAsPickleFile("foobar_seq") sc.pickleFile("foobar_seq")