『 Spark 』7. 使用 Spark DataFrame 進行大數(shù)據(jù)分析

『 Spark 』7. 使用 Spark DataFrame 進行大數(shù)據(jù)分析 | Taotao's Zone
http://litaotao.github.io/spark-dataframe-introduction?s=inner

寫在前面
本系列是綜合了自己在學習spark過程中的理解記錄 + 對參考文章中的一些理解 + 個人實踐spark過程中的一些心得而來。寫這樣一個系列僅僅是為了梳理個人學習spark的筆記記錄,所以一切以能夠理解為主,沒有必要的細節(jié)就不會記錄了,而且文中有時候會出現(xiàn)英文原版文檔,只要不影響理解,都不翻譯了。若想深入了解,最好閱讀參考文章和官方文檔。
其次,本系列是基于目前最新的 spark 1.6.0 系列開始的,spark 目前的更新速度很快,記錄一下版本號還是必要的。 最后,如果各位覺得內(nèi)容有誤,歡迎留言備注,所有留言 24 小時內(nèi)必定回復,非常感謝。
Tips: 如果插圖看起來不明顯,可以:1. 放大網(wǎng)頁;2. 新標簽中打開圖片,查看原圖哦;3. 點擊右邊目錄上方的 present mode 哦。

  1. 什么是 spark dataframe
    先來看看官方原汁原味的文檔是怎么介紹的:
    A DataFrame is a distributed collection of data
    organized into named columns. It is conceptually equivalent to a table in a relational database
    or a data frame in R/Python, but with richer optimizations
    under the hood. DataFrames can be constructed from a wide array of sources such as:structured data files, tables in Hive, external databases, or existing RDDs
    .
    我們可以看到 spark dataframe 的幾個關鍵點:
    分布式的數(shù)據(jù)集
    類似關系型數(shù)據(jù)庫中的table,或者 excel 里的一張 sheet,或者 python/R 里的 dataframe
    擁有豐富的操作函數(shù),類似于 rdd 中的算子
    一個 dataframe 可以被注冊成一張數(shù)據(jù)表,然后用 sql 語言在上面操作
    豐富的創(chuàng)建方式已有的RDD
    結構化數(shù)據(jù)文件
    JSON數(shù)據(jù)集
    Hive表
    外部數(shù)據(jù)庫

  2. 為什么要用 spark dataframe
    為什么要用 dataframe,從細節(jié)實現(xiàn)上來說,這個問題比較復雜,不過,基本上下面這張圖就能說明所有問題了:


    spark-dataframe-flow.png

    但是,本文是從基礎角度來說 spark dataframe,先不糾結這些細節(jié)問題,先了解一些基礎的原理和優(yōu)勢,關于上面那張圖里面的內(nèi)容,看后期安排,也許在之后第 15 篇左右會專門講。
    DataFrame API 是在 R 和 Python data frame 的設計靈感之上設計的,具有以下功能特性:
    從KB到PB級的數(shù)據(jù)量支持;
    多種數(shù)據(jù)格式和多種存儲系統(tǒng)支持;
    通過Spark SQL 的 Catalyst優(yōu)化器進行先進的優(yōu)化,生成代碼;
    通過Spark無縫集成所有大數(shù)據(jù)工具與基礎設施;
    為Python、Java、Scala和R語言(SparkR)API;

簡單來說,dataframe 能夠更方便的操作數(shù)據(jù)集,而且因為其底層是通過 spark sql 的 Catalyst優(yōu)化器生成優(yōu)化后的執(zhí)行代碼,所以其執(zhí)行速度會更快。總結下來就是,使用 spark dataframe 來構建 spark app,能:
write less : 寫更少的代碼
do more : 做更多的事情
faster : 以更快的速度

  1. 創(chuàng)建 dataframe
    因為 spark sql,dataframe,datasets 都是共用 spark sql 這個庫的,三者共享同樣的代碼優(yōu)化,生成以及執(zhí)行流程,所以 sql,dataframe,datasets 的入口都是 sqlContext??捎糜趧?chuàng)建 spark dataframe 的數(shù)據(jù)源有很多,我們就講最簡單的從結構化文件創(chuàng)建 dataframe。


    spark-dataframe-3.jpg

    step 1 : 創(chuàng)建 sqlContext

下面是我自己創(chuàng)建 spark sc 都模版:
sc_conf = SparkConf()

sc_conf.setAppName("03-DataFrame-01")

sc_conf.setMaster(SPARK_MASTER)

sc_conf.set('spark.executor.memory', '2g')

sc_conf.set('spark.logConf', True)

sc_conf.getAll()

try:

sc.stop()

time.sleep(1)

except:

sc = SparkContext(conf=sc_conf)

sqlContext = SQLContext(sc)

step 2 : 創(chuàng)建 dataframe,從 json 文件

數(shù)據(jù)文件說明:中國 A 股上市公司基本信息,可以在這里取到:stock_5.json

spark-dataframe-1.jpg

注:這里的 json 文件并不是標準的 json 文件,spark 目前也不支持讀取標準的 json 文件。你需要預先把標準的 json 文件處理成 spark 支持的格式: 每一行是一個 json 對象。
比如說,官網(wǎng)的 people.json
這個例子,它要求的格式是:
{"name":"Yin", "address":{"city":"Columbus","state":"Ohio"}}

{"name":"Michael", "address":{"city":null, "state":"California"}}

但對這個文件來看,標準的 json 格式只有下面兩種:
{"name": ["Yin", "Michael"],

"address":[

{"city":"Columbus","state":"Ohio"},

{"city":null, "state":"California"}

]

}

或者

[

{"name":"Yin", "address":{"city":"Columbus","state":"Ohio"}},

{"name":"Michael", "address":{"city":null, "state":"California"}}

]

所以在用 spark sql 來讀取一個 json 文件的時候,務必要提前處理好 json 的文件格式,這里我們已經(jīng)提前處理好了,文件如下所示:
{"ticker":"000001","tradeDate":"2016-03-30","exchangeCD":"XSHE","secShortName":"\u5e73\u5b89\u94f6\u884c","preClosePrice":10.43,"openPrice":10.48,"dealAmount":19661,"turnoverValue":572627417.1299999952,"highestPrice":10.7,"lowestPrice":10.47,"closePrice":10.7,"negMarketValue":126303384220.0,"marketValue":153102835340.0,"isOpen":1,"secID":"000001.XSHE","listDate":"1991-04-03","ListSector":"\u4e3b\u677f","totalShares":14308676200},

{"ticker":"000002","tradeDate":"2016-03-30","exchangeCD":"XSHE","secShortName":"\u4e07\u79d1A","preClosePrice":24.43,"openPrice":0.0,"dealAmount":0,"turnoverValue":0.0,"highestPrice":0.0,"lowestPrice":0.0,"closePrice":24.43,"negMarketValue":237174448154.0,"marketValue":269685994760.0,"isOpen":0,"secID":"000002.XSHE","listDate":"1991-01-29","ListSector":"\u4e3b\u677f","totalShares":11039132000}

df is short for dataframe

df = sqlContext.read.json('hdfs://10.21.208.21:8020/user/mercury/stock_5.json')

print df.printSchema()

print df.select(['ticker', 'secID', 'tradeDate', 'listDate', 'openPrice', 'closePrice',

'highestPrice', 'lowestPrice', 'isOpen']).show(n=5)

spark-dataframe-2.jpg
  1. 操作 dataframe
    同 rdd 一樣,dataframe 也有很多專屬于自己的算子,用于操作整個 dataframe 數(shù)據(jù)集,我們以后都簡稱為 dataframe api 吧,用 算子
    , DSL
    這類的稱呼對不熟悉的人來說不易理解,下面這里是完整的 api 列表:spark dataframe api
    4.1 在 dataframe 上執(zhí)行 sql 語句
    spark-dataframe-4.jpg

    4.2 spark dataframe 與 pandas dataframe 轉(zhuǎn)換
    一圖勝千言?。?br>
    spark-dataframe-6.jpg

    縱觀 spark 的誕生和發(fā)展,我覺得 spark 有一點做得非常明智:對同類產(chǎn)品的兼容。從大的方面來說,就像 spark 官網(wǎng)的這段話一樣: Runs Everywhere: Spark runs on Hadoop, Mesos, standalone, or in the cloud. It can access diverse data sources including HDFS, Cassandra, HBase, and S3.,spark 對 hadoop 系產(chǎn)品的兼容,讓 hadoop 系的開發(fā)人員可以輕松的從 hadoop 轉(zhuǎn)到 spark;從小的方面來說,spark 對一些細分工具也照顧 [兼容] 得很好,比如說 spark 推出了 dataframe,人家就可以支持 spark dataframe 和 pandas dataframe 的轉(zhuǎn)換。
    熟悉 pandas dataframe 的都了解,pandas 里的 dataframe 可以做很多事情,比如說畫圖,保存為各種類型的文件,做數(shù)據(jù)分析什么的。我覺得,可以在 spark 的 dataframe 里做數(shù)據(jù)處理,分析的整個邏輯,然后可以把最后的結果轉(zhuǎn)化成 pandas 的 dataframe 來展示。當然,如果你的數(shù)據(jù)量小,也可以直接用 pandas dataframe 來做。
    spark-dataframe-7.jpg
  2. 一些經(jīng)驗
    5.1 spark json 格式問題
    spark 目前也不支持讀取標準的 json 文件。你需要預先把標準的 json 文件處理成 spark 支持的格式: 每一行是一個 json 對象。
    5.2 spark dataframe 和 pandas dataframe 選擇問題
    如果數(shù)據(jù)量小,結構簡單,可以直接用 pandas dataframe 來做分析;如果數(shù)據(jù)量大,結構復雜 [嵌套結構],那么推薦用 spark dataframe 來做數(shù)據(jù)分析,然后把結果轉(zhuǎn)成 pandas dataframe,用 pandas dataframe 來做展示和報告。
  3. Next
    ok,dataframe 簡單的也說了幾句了。我們先緩一緩,上個例子,再接著講起他的,例子的話就用一個我正在實踐的:用 spark 來做量化投資。
  4. 打開微信,掃一掃,點一點,棒棒的,_
    wechat_pay_6-6.png

    參考文章
    Spark SQL, DataFrames and Datasets Guide
    Introducing DataFrames in Spark for Large Scale Data Science
    From Webinar Apache Spark 1.5: What is the difference between a DataFrame and a RDD?
    用Apache Spark進行大數(shù)據(jù)處理——第二部分:Spark SQL
    An introduction to JSON support in Spark SQL
    Spark新年福音:一個用于大規(guī)模數(shù)據(jù)科學的API——DataFrame
    An introduction to JSON support in Spark SQL

本系列文章鏈接
『 Spark 』1. spark 簡介
『 Spark 』2. spark 基本概念解析
『 Spark 』3. spark 編程模式
『 Spark 』4. spark 之 RDD
『 Spark 』5. 這些年,你不能錯過的 spark 學習資源
『 Spark 』6. 深入研究 spark 運行原理之 job, stage, task
『 Spark 』7. 使用 Spark DataFrame 進行大數(shù)據(jù)分析
『 Spark 』8. 實戰(zhàn)案例 | Spark 在金融領域的應用 | 日內(nèi)走勢預測
『 Spark 』9. 搭建 IPython + Notebook + Spark 開發(fā)環(huán)境
『 Spark 』10. spark 應用程序性能優(yōu)化|12 個優(yōu)化方法
『 Spark 』11. spark 機器學習
『 Spark 』12. Spark 2.0 特性介紹
『 Spark 』13. Spark 2.0 Release Notes 中文版

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容