使用Parquet

今天把Dataframe存成parquet,發現用parquet分析超快的!

val ehaveDF = spark.read
  .parquet("hdfs://namenode-0.hdfs.mesos:9001/parquet/ehave.parquet")
ehaveDF.printSchema

這邊有趣的是,似乎把Dataframe存成parquet的時候也有存schema資訊(未證實),如果是這樣的話用起來就很方便,不用每次一直搞schama

mongoEhaveDf.write
  .mode("overwrite")
  .parquet("hdfs://namenode-0.hdfs.mesos:9001/parquet/ehave.parquet")

NaN

mongo的NaN資料型態存到parquet會發生問題

我把mongodb.IEDB.EHAVE_TBL存成parquet的時候,有遇到一個問題:讀取資料的時候會出現「檔案損壞」的錯誤。後來發現是只有特定欄位才會有這個錯誤,最後把比較特別的資料型態NaN去掉(改成null)之後,目前是正常使用parquet中。

速度比較

parquet大勝。在這個測試中,因為工作量比較多,即使「轉檔時間+運算時間」快很多!

我用下面的程式比較mongo與parquet的速度(46次aggregate)

println("%table\ncolumn\tvalue\tcount")
ehaveDf.schema.fieldNames.foreach { colName =>
  // run 46 times
  val rows = ehaveDF2.groupBy(colName)
    .count
    .sort($"count".desc)
    .take(20)
  printTableRows(colName, rows)
}

結果:

mongo          : 3 hr  0 min 44 sec
parquet        :       8 min 14 sec
mongoparquet :      10 min  1 sec

Check out at Zeppelin Notebook

more!