【问题标题】:How to restore RDD of (key,value) pairs after it has been stored/read from a text file如何在存储/读取文本文件后恢复(键,值)对的RDD
【发布时间】:2015-10-08 16:18:46
【问题描述】:

我使用 saveAsTextFile 将我的 (key, value) 对的 RDD 保存到一个文本文件中。在我使用 sc.textFile("filename.txt") 命令读回文本文件后,我得到了字符串,而不是 (key, value) 对。我的键曾经是字符串,而值是浮点数列表。这是一个例子:

(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。

【问题讨论】:

    标签: python apache-spark pyspark


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您将不得不为您的输入实现一个解析器。最简单的做法是使用制表符或冒号分隔符将您的输出映射到一个字符分隔的输出,并在阅读时在您的地图中使用 spilt(delimiter),基本上就像在 wordCount 示例中一样。

      【讨论】:

      • 这在一般情况下是正确的,尤其是在 Scala 中,但在 Python 中,只要 unicode 返回一个明确且可解析的表示,它实际上非常容易。
      猜你喜欢
      • 1970-01-01
      • 2013-12-28
      • 1970-01-01
      • 1970-01-01
      • 2019-12-22
      • 2021-04-01
      • 2016-07-12
      • 1970-01-01
      相关资源
      最近更新 更多