2016-09-02 50 views
0

業務案例是我們希望將一個大的拼花地板文件分割成一列作爲分區。我們已經測試了使用dataframe.partition(「xxx」)。write(...)。大約花費了1小時,有100K條記錄。因此,我們將使用map reduce在不同的文件夾中生成不同的parquet文件。示例代碼:火花是否支持拼接格式的多個輸出文件

import org.apache.hadoop.io.NullWritable 

import org.apache.spark._ 
import org.apache.spark.SparkContext._ 

import org.apache.hadoop.mapred.lib.MultipleTextOutputFormat 

class RDDMultipleTextOutputFormat extends MultipleTextOutputFormat[Any, Any] { 
    override def generateFileNameForKeyValue(key: Any, value: Any, name: String): String = 
    key.asInstanceOf[String]+"/aa" 
} 

object Split { 
    def main(args: Array[String]) { 
    val conf = new SparkConf().setAppName("SplitTest") 
    val sc = new SparkContext(conf) 
    sc.parallelize(List(("w", "www"), ("b", "blog"), ("c", "com"), ("w", "bt"))) 
     .map(value => (value._1, value._2 + "Test")) 
     .partitionBy(new HashPartitioner(3))//.saveAsNewAPIHadoopFile(path, keyClass, valueClass, outputFormatClass, conf) 
     .saveAsHadoopFile(args(0), classOf[String], classOf[String], 
     classOf[RDDMultipleTextOutputFormat]) 
    sc.stop() 
    } 
} 

上面的示例只是生成一個文本文件,如何生成具有multipleoutputformat的鑲木地板文件?

回答

1

火花支持鑲木分區因爲1.4.0(1.5+語法):

df.write.partitionBy("some") 

和桶裝自(2.0.0):

df.write.bucketBy("some") 

具有可選sortBy子句。