【问题标题】:How can I read RDD in my java program from a file that was created by Python program如何从 Python 程序创建的文件中读取我的 java 程序中的 RDD
【发布时间】:2015-10-22 17:08:54
【问题描述】:

我有一个 python Spark 程序,它从原始数据创建特征并使用 saveAsPickleFile 方法将它们存储到 Pickle 文件中。我也可以使用saveAsTextFile 方法。

另一个程序是用 Java 编写的,使用 ML 实现分类器。

是否可以将序列化的 pickle 文件读入 Java 中的 RDD?

【问题讨论】:

  • 谁能解释一下你为什么给我负面反馈?在我提交这个问题之前,我花了很多时间寻找答案?如果你知道答案,知道我在哪里可以找到,等等。请告诉我。给予负面反馈是没有成效的。我问这个问题是为了得到帮助,不要被放下!
  • 我不知道,为什么人们不赞成投票 - 你的问题对我来说似乎是合理的。我不熟悉 python 或 pickle 文件,但如果你使用 saveAsTextFile 代替,那么之后在 Java 中阅读它是直接使用 sc.textFile("/path/to/your/file")
  • 我同意@GlennieHellesSindholt。关于 pickle 文件,即使有允许读取 Pickle 对象的框架,您也可以考虑使用 textFiles 代替,因为解决方案更简单。

标签: java python apache-spark rdd


【解决方案1】:
  • saveAsPickleFile 使用标准的 pickle 模块。可以读取使用 pickle 序列化的对象,例如使用 Jython pickle,但这远非简单
  • saveAsTextFile 创建一个纯文本文件。也没有理由不能在 Java 中加载它。问题是您仍然必须解析内容。 saveAsTextFile 的 PySpark 版本只是使用 unicode 方法,它不必返回任何有意义的表示。如果你想要一些可以轻松加载的东西,手动创建字符串表示是个好主意
  • 对于键值,最简单的方法是使用saveAsSequenceFile / sequenceFile

    rdd = sc.parallelize([(1L, "foo"), (2L, "bar")])
    rdd.saveAsSequenceFile("pairs")
    
    sc.sequenceFile[Long, String]("pairs").collect()
    // Array[(Long, String)] = Array((2,bar), (1,foo))
    
  • 如果您有更复杂的数据,您可以使用 Parquet 文件:

    from pyspark.mllib.linalg import DenseVector
    
    rdd = sc.parallelize([
        (1L, DenseVector([1, 2])), (2L, DenseVector([3, 4]))])
    rdd.toDF().write.parquet("pairs_parquet")
    
    sqlContext.read.parquet("pairs_parquet").rdd.collect()
    // Array[org.apache.spark.sql.Row] = Array([2,[3.0,4.0]], [1,[1.0,2.0]])
    
  • Avro 甚至简单的 JSON 也可能是一个可行的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多