如何使用spark生成和输出多个java对象?

时间:2017-12-14 03:15:48

标签: hadoop apache-spark

我在hadoop文件系统hdfs上有一个CSV,我希望使用这个框架将其转换为多个序列化的java对象:

https://github.com/clarkduvall/serpy

我听说过avro和镶木地板。我不想使用它们并希望输出序列化的二进制文件。我的csv文件包含以下记录:

Name, Age, Date
Jordan, 1, 1/1/2017
John, 5, 2/2/2017

这可能使用Hadoop或Spark吗?输出对象应该可以通过普通的非hadoop / spark相关Java程序读取。任何一个例子将不胜感激!

1 个答案:

答案 0 :(得分:0)

  

输出对象应该可以被普通的非hadoop / spark相关的Java程序读取

为此,您需要将结果保存在HDFS之外。所以你能做的是:

  • 使用Spark
  • 中的SparkContext.textFile从HDFS读取CSV数据
  • 使用RDD.take()将有限数量的行添加到驱动程序中
    • 此处的参数将是您想要的行数,例如myRdd.take(1000)抓1000行
  • myRdd.collect()将获取所有内容,但如果您有大量数据,则可能导致Spark驱动程序出现OutOfMemoryError
  • 现在,您将所有行都作为数组,您可以使用基本的java序列化程序
  • 存储它们

示例代码:

val sc = new SparkContext(conf)
val myRdd = sc.textFile("hdfs://namenode/mypath/myfile.csv")
val myArray = myRdd.take(100000)
//Store myArray to file using java serialiser

如果要在HDFS上存储序列化数据,可以执行以下操作:

val sc = new SparkContext(conf)
val myRdd = sc.textFile("hdfs://namenode/mypath/myfile.csv")
myRdd.saveAsObjectFile("hdfs://namenode/mypath/myoutput.obj")

这将保存一个数组[String]。您可以在第2行和第3行之间转换RDD,以使其对

更有用