1

我可以运行此脚本以文本格式保存文件,但是当我尝试运行 saveAsSequenceFile 时出错。如果有人知道如何将 RDD 保存为序列文件,请告诉我该过程。我尝试在“Learning Spark”以及 Spark 官方文档中寻找解决方案。

这运行成功

dataRDD = sc.textFile("/user/cloudera/sqoop_import/departments")
dataRDD.saveAsTextFile("/user/cloudera/pyspark/departments")

这失败了

dataRDD = sc.textFile("/user/cloudera/sqoop_import/departments")
dataRDD.saveAsSequenceFile("/user/cloudera/pyspark/departmentsSeq")

错误:调用 z:org.apache.spark.api.python.PythonRDD.saveAsSequenceFile 时出错。: org.apache.spark.SparkException: 无法使用 java.lang.String 类型的 RDD 元素

这是数据:

2,Fitness
3,Footwear
4,Apparel
5,Golf
6,Outdoors
7,Fan Shop
8,TESTING
8000,TESTING
4

2 回答 2

6

序列文件用于存储键值对,因此您不能简单地存储RDD[String]. 鉴于您的数据,我猜您正在寻找这样的东西:

rdd = sc.parallelize([
    "2,Fitness", "3,Footwear", "4,Apparel"
])
rdd.map(lambda x: tuple(x.split(",", 1))).saveAsSequenceFile("testSeq")

如果要保留整个字符串,只需使用None键:

rdd.map(lambda x: (None, x)).saveAsSequenceFile("testSeqNone")
于 2015-12-28T10:50:55.290 回答
1

要写入序列文件,您需要 Hadoop API 格式的数据。

字符串作为文本
Int 作为 IntWritable

在 Python 中:

data = [(1, ""),(1, "a"),(2, "bcdf")]
sc.parallelize(data).saveAsNewAPIHadoopFile(path,"org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat","org.apache.hadoop.io.IntWritable","org.apache.hadoop.io.Text")
于 2015-12-28T10:35:36.293 回答