標籤:

如何使用 parquet file 建立一個 RDD 的同時讀進 case class 結構?

抱歉這個問題有點偏,可能絕大多數人不會感興趣。

不過鑒於知乎上有很多 Spark 的專家,但凡做這個領域的人應該對 parquet file 不算陌生。當使用 parquetFile 命令建立一個 schemaRDD 的時候,我會希望能夠加入預設好了的 case class 結構,但是一時很難找到良好的方法達成。

reference: Spark SQL Programming Guide


目前並沒有自動將Row映射到case class的方法,只能在map中手工構造case class。不過以下寫法可能更方便些:

case class Record(key: Int, value: Double, comment: String)

df.map { case Row(key: Int, value: Double, comment: String) =&>
Record(key, value, comment)
}

即將發布的Spark 1.3.0中,SchemaRDD被升級為DataFrame,提供了一系列類似於R和Pandas的DataFrame的API,大大簡化了常見的數據處理任務,大部分情況下不需要再將Row手工轉為case class即可完成需要的數據變換。DataFrame/SchemaRDD相對於裝著case class的普通RDD的優勢在於帶有schema信息,所有變換都轉換問關係查詢計劃。查詢優化器可以針對具體的查詢和數據源類型進行查詢優化。

1.2.0以前SchemaRDD的DSL API尚不完整,使用起來還不是十分方便,不少時候不得不退化到普通RDD進行計算。1.3.0的DataFrame API已經十分完整,實際上不再推薦直接使用普通RDD API,而是推薦使用DataFrame API以利用Spark SQL的query optimizer。只有在數據流水線末尾獲取最終結果的時候才需要將DataFrame再轉為裝著case class或其他類型的普通RDD。

參考:

  1. Databricks blog: Introducing DataFrames in Spark for Large Scale Data Science

  2. Spark meetup slides: http://www.slideshare.net/databricks/introducing-dataframes-in-spark-for-large-scale-data-science


parquet file 本身就帶有描述信息,在讀成schema rdd 後,rdd中就帶有對應的描述信息,如果題主所說的『』加入自定義case class的信息就是讓rdd中的內容變成對應的case class『』 的話,只需要使用對應的轉換函數即可,map ,mapPartation兩者選一個即可


推薦閱讀:

Hadoop、spark、SaaS、PaaS、IaaS、雲計算概念區分?
Spark中,Dataset和DataFrame的性能比較?
深入淺出Spark(三)什麼是Standalone

TAG:Spark |