2016-03-19 10 views
5

Spark SQLのDataFrame.write()メソッドで生成された出力ファイルは、 "part"ベース名の接頭辞で始まります。例えば私はスパークSQL DataFrame.write()を使用してファイルを作成するときに使用される出力ファイル名の接頭辞を変更したいDataFrame.write()の出力ファイル名のプレフィックスを変更する

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 

:中

DataFrame sample_07 = hiveContext.table("sample_07"); 
sample_07.write().parquet("sample_07_parquet"); 

結果。 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()メソッドの使用時に出力ファイル名のプレフィックスを上書きする方法はありますか?

答えて

7

標準出力形式(Parquetなど)のいずれかを使用しているときは、 "part"プレフィックスを変更することはできません。 ParquetRelation source codeからこのスニペットを参照してください:あなたは本当に一部のファイル名を制御しなければならない場合

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を実装し、FileOutputFormatクラスを受け入れるメソッドを保存スパークののいずれかを使用する必要があります(例:saveAsHadoopFileを) 。

+0

返信いただきありがとうございます。とても有難い。 – Rob

関連する問題