可以将Spark DataFrame.saveAsCsvFile()的输出保存为纯文本文件,而不是.gz文件吗?

时间:2015-05-29 01:39:25

标签: shell apache-spark hdfs apache-spark-sql

我想将Spark SQL DataFrame的内容df保存为纯文本文件格式。我的DataFrame很简单,有3个整数列:

1   3   10
2   5   4
3   2   34
...

当我使用Spark群集上运行的df.saveAsCsvFile(outputPath)库中的com.databricks.spark.csv._时,输出文件在HDFS中保存为part-00000.gz, part-00001.gz, ...

有没有办法以纯文本文件格式保存输出,而不是.gz格式?或者,在HDFS中有gunzip的好方法吗?

我写了一个小的shell脚本来处理文件,但这需要将数据复制到本地文件系统。这可以用于此作业,因为部分文件只有几KB,但如果可能的话,我们希望避免这种情况。

TEMP_DIR=spark_temp
OUTPUT=output.csv

hadoop fs -get hdfsDirName $TEMP_DIR
NUM=$(($(ls -l $TEMP_DIR | wc -l) - 2))
for i in $(seq 1 $NUM); do ls $TEMP_DIR/*.gz | head -1 | xargs gunzip ; done

rm -f $OUTPUT
cat $TEMP_DIR/part* > $OUTPUT
rm -r $TEMP_DIR

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这是你用Java做的。如果您有re.escape(),那么您使用的是Spark 1.3或更高版本。数据框就像1.2中的JavaSchemaRDD,它基本上意味着具有模式的JavaRDD。我相信您可以在数据框上使用DataFrame函数将其保存到文本文件中。确保您执行saveAsTextFile(),这样您才能拥有多个文件。如果这不起作用,则另一项措施是将数据框上的repartition(1)转换为CollectAsList

  1. 收集清单:

    List<Row>
  2. 然后:

    List<Row> dflist = df.collectAsList();
    
  3. 完成后,请保存JavaRDD<Row> rddname = sc.parallelize(dflist)

    JavaRDD<Row>