在數據分析領域,最熱門的莫過于Python和R語言,此前有一篇文章《別老扯什么Hadoop了,你的數據根本不夠大》指出:只有在超過5TB數據量的規模下,Hadoop才是一個合理的技術選擇。這次拿到近億條日志數據,千萬級數據已經是關系型數據庫的查詢分析瓶頸,之前使用過Hadoop對大量文本進行分類,這次決定采用Python來處理數據:
硬件環境
CPU:3.5 GHz Intel Core i7
內存:32 GB HDDR 3 1600 MHz
硬盤:3 TB Fusion Drive
數據分析工具
Python:2.7.6
Pandas:0.15.0
IPython notebook:2.0.0
源數據如下表所示:
數據讀取
啟動IPython notebook,加載pylab環境:
ipython notebook --pylab=inline
Pandas提供了IO工具可以將大文件分塊讀取,測試了一下性能,完整加載9800萬條數據也只需要263秒左右,還是相當不錯了。
import pandas as pd
reader = pd.read_csv('data/servicelogs', iterator=True)
try:
df = reader.get_chunk(100000000)
except StopIteration:
print "Iteration is stopped."
使用不同分塊大小來讀取再調用 pandas.concat 連接DataFrame,chunkSize設置在1000萬條左右速度優化比較明顯。
loop = TruechunkSize = 100000chunks = []while loop: try: chunk = reader.get_chunk(chunkSize) chunks.append(chunk) except StopIteration: loop = False print "Iteration is stopped."df = pd.concat(chunks, ignore_index=True)
下面是統計數據,Read Time是數據讀取時間,Total Time是讀取和Pandas進行concat操作的時間,根據數據總量來看,對5~50個DataFrame對象進行合并,性能表現比較好。
如果使用Spark提供的Python Shell,同樣編寫Pandas加載數據,時間會短25秒左右,看來Spark對Python的內存使用都有優化。
數據清洗
Pandas提供了 DataFrame.describe 方法查看數據摘要,包括數據查看(默認共輸出首尾60行數據)和行列統計。由于源數據通常包含一些空值甚至空列,會影響數據分析的時間和效率,在預覽了數據摘要后,需要對這些無效數據進行處理。
新聞熱點
疑難解答