在独立火花上合并镶木地板文件

时间:2015-08-31 13:37:15

标签: apache-spark apache-spark-sql

是否有一种简单的方法可以将user=> (merge {} {:a 1 :b 1}) {:a 1, :b 1} user=> (let [x (atom {})] #_=> (swap! x merge {:a 1 :b 2}) #_=> x) #object[clojure.lang.Atom 0x1be09e1b {:status :ready, :val {:a 1, :b 2}}] 保存到 DataFrame文件中,或合并包含元数据的目录以及由此生成的parquet文件的部分内容parquet成为存储在NFS上的单个文件而不使用HDFS和hadoop?

3 个答案:

答案 0 :(得分:5)

要保存一个文件而不是多个文件,您可以在保存数据之前在RDD / Dataframe上调用coalesce(1) / repartition(1)

如果您已有一个包含小文件的目录,则可以创建一个Compacter进程,该进程将读取现有文件并将其保存到一个新文件中。 E.g。

val rows = parquetFile(...).coalesce(1)
rows.saveAsParquetFile(...)

您可以使用saveAsParquetFile存储到本地文件系统。 e.g。

rows.saveAsParquetFile("/tmp/onefile/")

答案 1 :(得分:0)

我能够使用此方法使用带有Spark 1.6.1的snappy格式压缩镶木地板文件。我使用了覆盖,以便我可以在需要时重复这个过程。这是代码。

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.SaveMode

object CompressApp {
  val serverPort = "hdfs://myserver:8020/"
  val inputUri = serverPort + "input"
  val outputUri = serverPort + "output"

  val config = new SparkConf()
           .setAppName("compress-app")
           .setMaster("local[*]")
  val sc = SparkContext.getOrCreate(config)
  val sqlContext = SQLContext.getOrCreate(sc)
  sqlContext.setConf("spark.sql.parquet.compression.codec", "snappy")  
  import sqlContext.implicits._

  def main(args: Array[String]) {
    println("Compressing Parquet...")
    val df = sqlContext.read.parquet(inputUri).coalesce(1)
    df.write.mode(SaveMode.Overwrite).parquet(outputUri)
    println("Done.")
  }
}

答案 2 :(得分:0)

coalesce(N)到目前为止救了我。
如果您的表已分区,请同时使用repartition("partition key")