是否有一种简单的方法可以将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?
答案 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")
。