更改DataFrame.write()的输出文件名前缀

通过Spark SQL DataFrame.write()方法生成的输出文件以“ part”基本名称前缀开头。例如

DataFrame sample_07 = hiveContext.table("sample_07");

sample_07.write().parquet("sample_07_parquet");

结果是:

hdfs dfs -ls sample_07_parquet/                                                                                                                                                             

Found 4 items

-rw-r--r-- 1 rob rob 0 2016-03-19 16:40 sample_07_parquet/_SUCCESS

-rw-r--r-- 1 rob rob 491 2016-03-19 16:40 sample_07_parquet/_common_metadata

-rw-r--r-- 1 rob rob 1025 2016-03-19 16:40 sample_07_parquet/_metadata

-rw-r--r-- 1 rob rob 17194 2016-03-19 16:40 sample_07_parquet/part-r-00000-cefb2ac6-9f44-4ce4-93d9-8e7de3f2cb92.gz.parquet

我想更改使用Spark SQL DataFrame.write()创建文件时使用的输出文件名前缀。我尝试在Spark上下文的hadoop配置上设置“

mapreduce.output.basename”属性。例如

public class MyJavaSparkSQL {

public static void main(String[] args) throws Exception {

SparkConf sparkConf = new SparkConf().setAppName("MyJavaSparkSQL");

JavaSparkContext ctx = new JavaSparkContext(sparkConf);

ctx.hadoopConfiguration().set("mapreduce.output.basename", "myprefix");

HiveContext hiveContext = new org.apache.spark.sql.hive.HiveContext(ctx.sc());

DataFrame sample_07 = hiveContext.table("sample_07");

sample_07.write().parquet("sample_07_parquet");

ctx.stop();

}

这不会更改生成文件的输出文件名前缀。

使用DataFrame.write()方法时,是否有方法可以覆盖输出文件名前缀?

回答:

使用任何标准输出格式(例如Parquet)时,都不能更改“ part”前缀。请参阅ParquetRelation

源代码中的以下片段:

private val recordWriter: RecordWriter[Void, InternalRow] = {

val outputFormat = {

new ParquetOutputFormat[InternalRow]() {

// ...

override def getDefaultWorkFile(context: TaskAttemptContext, extension: String): Path = {

// ..

// prefix is hard-coded here:

new Path(path, f"part-r-$split%05d-$uniqueWriteJobId$bucketString$extension")

}

}

}

如果确实必须控制零件文件名,则可能必须实现自定义FileOutputFormat并使用Spark的其中一个接受FileOutputFormat类的保存方法(例如saveAsHadoopFile)。

以上是 更改DataFrame.write()的输出文件名前缀 的全部内容, 来源链接: utcz.com/qa/433744.html

回到顶部