吐槽
最近有工作需要分析Reddit的數據。Reddit的數據好處是格式整齊,但是由于每條很小,導致數據的記錄條目還是蠻大的。舉個例子,我用Solr 6.0建2012到2013年的post的索引,半年的索引建了六七個小時,一年的因為超時沒有建立起來。而且,我還只是針對幾個特定的域建立索引。
目的
原本計劃通過Solr把查詢相關的文檔都給找出來,建立一個相關文檔創建時間的time-series data。結果一年的索引我服務器上都沒搭起來,從07年到15年的ts data就更沒辦法通過這個方式搞定了。
東找西找發現Reddit的數據早就被人上傳到了Google BigQuery上建立了表格,可以支持類SQL語句的查詢,于是,只好通過這個辦法聚合需要的數據的time-series data了。
Hands-on
- 首先是注冊BigQuery,建立項目,給項目開啟BigQuery的API。(這一步有官方文檔)
- 然后對于響應的項目,生成憑證(credentials),并將憑證在.bash_profile文件中設置為默認。
GOOGLE_APPLICATION_CREDENTIALS=/$Path/key.json
export GOOGLE_APPLICATION_CREDENTIALS
- 在python代碼中就可以調用了
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from oauth2client.client import GoogleCredentials
import pandas as pd
# 從環境變量中獲取默認credentials
credentials = GoogleCredentials.get_application_default()
# 構建與BigQuery API交互的服務對象
bigquery_service = build('bigquery', 'v2', credentials=credentials)
# ~~~構建query~~~
# 用pandas提供的結構直接將查詢結果讀入data frame中,并存入.csv文件
df = pd.io.gbq.read_gbq(query_data_string, project_id=project_id)
output_file_name = query_id + ".csv"
df.to_csv(output_file_name, sep='\t', encoding='utf-8')
print "Finished: " + output_file_name
其中,query_data_string是一個類SQL語句,關于Query的語句的支持可以參考query reference.