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

Java 更改DataFrame.write()的输出文件名前缀,java,apache-spark,mapreduce,apache-spark-sql,Java,Apache Spark,Mapreduce,Apache Spark Sql,通过Spark SQL DataFrame.write()方法生成的输出文件以“part”basename前缀开头。e、 g DataFrame sample_07 = hiveContext.table("sample_07"); sample_07.write().parquet("sample_07_parquet"); 结果: hdfs dfs -ls sample_07_parquet/

通过Spark SQL DataFrame.write()方法生成的输出文件以“part”basename前缀开头。e、 g

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”属性。e、 g

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()方法时,是否有方法覆盖输出文件名前缀?

在使用任何标准输出格式(如拼花)时,都不能更改“部分”前缀。请参阅ParquetRelation的以下片段:


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

假设输出文件夹中只有一个
csv
文件,我们可以使用以下代码以语法(或动态)方式重命名此文件。在下面的代码(最后一行)中,使用
csv
类型从输出目录获取所有文件,并将其重命名为所需的文件名

import org.apache.hadoop.fs.{FileSystem, Path}
import org.apache.hadoop.conf.Configuration
val outputfolder_Path = "s3://<s3_AccessKey>:<s3_Securitykey>@<external_bucket>/<path>"     
val fs = FileSystem.get(new java.net.URI(outputfolder_Path), new Configuration())   
fs.globStatus(new Path(outputfolder_Path + "/*.*")).filter(_.getPath.toString.split("/").last.split("\\.").last == "csv").foreach{l=>{ fs.rename(new Path(l.getPath.toString), new Path(outputfolder_Path + "/DesiredFilename.csv")) }}
import org.apache.hadoop.fs.{FileSystem,Path}
导入org.apache.hadoop.conf.Configuration
val outputfolder_Path=“s3://:@”
val fs=FileSystem.get(新的java.net.URI(outputfolder_Path),新配置()
fs.globStatus(新路径(outputfolder\u Path+“/*.*)).filter(\u.getPath.toString.split(“/”).last.split(“\\”).last==“csv”).foreach{l=>{fs.rename(新路径(l.getPath.toString)),新路径(outputfolder\u Path+“/DesiredFilename.csv”)}
import org.apache.hadoop.fs.{FileSystem, Path}
import org.apache.hadoop.conf.Configuration
val outputfolder_Path = "s3://<s3_AccessKey>:<s3_Securitykey>@<external_bucket>/<path>"     
val fs = FileSystem.get(new java.net.URI(outputfolder_Path), new Configuration())   
fs.globStatus(new Path(outputfolder_Path + "/*.*")).filter(_.getPath.toString.split("/").last.split("\\.").last == "csv").foreach{l=>{ fs.rename(new Path(l.getPath.toString), new Path(outputfolder_Path + "/DesiredFilename.csv")) }}