我想将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
感谢您的帮助!
答案 0 :(得分:0)
这是你用Java做的。如果您有re.escape()
,那么您使用的是Spark 1.3或更高版本。数据框就像1.2中的JavaSchemaRDD,它基本上意味着具有模式的JavaRDD。我相信您可以在数据框上使用DataFrame
函数将其保存到文本文件中。确保您执行saveAsTextFile()
,这样您才能拥有多个文件。如果这不起作用,则另一项措施是将数据框上的repartition(1)
转换为CollectAsList
。
收集清单:
List<Row>
然后:
List<Row> dflist = df.collectAsList();
完成后,请保存JavaRDD<Row> rddname = sc.parallelize(dflist)
:
JavaRDD<Row>