2016-03-19 17 views
5

Tệp đầu ra được tạo ra thông qua phương thức Spark SQL DataFrame.write() bắt đầu bằng tiền tố "part" tên cơ sở. ví dụ.Thay đổi tiền tố tên tệp đầu ra cho DataFrame.write()

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

Kết quả trong:

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 

Tôi muốn thay đổi tiền tố đầu ra tên tập tin được sử dụng khi tạo ra một tập tin sử dụng Spark SQL DataFrame.write(). Tôi đã thử đặt thuộc tính "mapreduce.output.basename" trên cấu hình hadoop cho bối cảnh Spark. ví dụ.

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(); 
    } 

Điều đó không thay đổi tiền tố tên tệp đầu ra cho các tệp được tạo.

Có cách nào để ghi đè tiền tố tên tệp đầu ra khi sử dụng phương thức DataFrame.write() không?

Trả lời

7

Bạn không thể thay đổi tiền tố "phần" trong khi sử dụng bất kỳ định dạng đầu ra tiêu chuẩn nào (như Ván sàn). Xem đoạn này từ 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") 
    } 
    } 
} 

Nếu bạn thực sự phải kiểm soát các tên tập tin một phần, có thể bạn sẽ phải thực hiện một FileOutputFormat tùy chỉnh và sử dụng một trong Spark lưu phương pháp mà chấp nhận một lớp FileOutputFormat (ví dụ saveAsHadoopFile) .

+0

Cảm ơn bạn đã trả lời. Nhiều đánh giá cao. – Rob

Các vấn đề liên quan