如何在从文本文件 stored/read 后恢复(键,值)对的 RDD
How to restore RDD of (key,value) pairs after it has been stored/read from a text file
我使用 saveAsTextFile 将(键,值)对的 RDD 保存到文本文件中。在我使用 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 读取命令会在读取时执行?
我正在使用 Spark 的 Python 接口。
您将必须为您的输入实现一个解析器。最简单的方法是将输出映射到带有制表符或冒号分隔符的字符分隔输出,并在阅读时在映射中使用 spilt(delimiter),基本上就像在 wordCount 示例中一样。
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")
我使用 saveAsTextFile 将(键,值)对的 RDD 保存到文本文件中。在我使用 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 读取命令会在读取时执行?
我正在使用 Spark 的 Python 接口。
您将必须为您的输入实现一个解析器。最简单的方法是将输出映射到带有制表符或冒号分隔符的字符分隔输出,并在阅读时在映射中使用 spilt(delimiter),基本上就像在 wordCount 示例中一样。
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")