在pysp中将RDD保存为序列文件

2024-09-26 22:49:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我可以运行这个脚本以文本格式保存文件,但是当我尝试运行saveAsSequenceFile时,它出错了。如果有人知道如何将RDD保存为序列文件,请让我知道这个过程。我试图在“学习火花”和官方火花文件中寻找解决方案。

此操作成功运行

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

Error: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.saveAsSequenceFile. : org.apache.spark.SparkException: RDD element of type java.lang.String cannot be used

数据如下:

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

Tags: 文件orgimportapachepyspark火花scrdd
2条回答

要写入序列文件,需要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")

序列文件用于存储键值对,因此不能简单地存储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")

相关问题 更多 >

    热门问题