PyOdps在交互式環境下的使用,讓探索ODPS數據更容易些
來自: http://qinxuye.me/article/pyodps-interactive-enhancement/
春節結束了,是時候來些新鮮玩意,讓我們來看一些酷的東西。
當當當當:隆重推出PyOdps logo:
好像跑題了,好吧,讓我們言歸正傳。
我們知道Python提供了一個交互式的環境,能夠方便探索和試驗想法。同時, IPython 是Python交互環境的增強,提供了很多強大的功能;IPython Notebook(現在已經是Jupyter Notebook)則更酷,提供了一個web界面,除了提供交互環境,還是一個記錄計算過程的『筆記本』。
PyOdps也提供了一系列在 交互式環境下的增強工具 ,使得探索ODPS數據更方便快捷。
配置ODPS帳號
Python交互環境
同一個環境支持配置若干個ODPS帳號,只需要:
In [1]: from odps.inter import setupIn [2]: setup('your-access_id', 'your-access-key', 'your-project', endpoint='your-endpoint')</pre>
此時這個帳號會被配置到一個叫做 default 的我們稱之為 room 的地方。以后我們再使用這個帳號只需要:
In [3]: from odps.inter import enterIn [4]: room = enter()
In [5]: o = room.odps
In [6]: o.get_table('dual') Out[6]: odps.Table name: odps_test_sqltask_finance.
dual
schema: c_int_a : bigint
c_int_b : bigint
c_double_a : double
c_double_b : double
c_string_a : string
c_string_b : string
c_bool_a : boolean
c_bool_b : boolean
c_datetime_a : datetime
c_datetime_b : datetime</pre>通過 room 的odps屬性,我們可以取到ODPS的入口,這樣就可以接著進行ODPS操作了。配置了別的 room 比如叫做myodps,要取到ODPS入口,只需要 enter('myodps').odps 即可。
list_rooms 方法能列出所有的 room 。
In [17]: from odps.inter import list_roomsIn [18]: list_rooms() Out[18]: ['default', 'meta']</pre>
IPython及Jupyter Notebook
PyOdps還提供了IPython插件。首先我們需要加載插件:
In [11]: %load_ext odpsIn [14]: %enter Out[14]:
In [15]: o = _.odps
In [16]: o.get_table('dual') Out[16]: odps.Table name: odps_test_sqltask_finance.
dual
schema: c_int_a : bigint
c_int_b : bigint
c_double_a : double
c_double_b : double
c_string_a : string
c_string_b : string
c_bool_a : boolean
c_bool_b : boolean
c_datetime_a : datetime
c_datetimeb : datetime</pre>下劃線能取到上一步的結果。 </p>
保存常用的ODPS對象
room 除了提供ODPS入口的功能,還能保存常用的ODPS對象。比如,我們能把常用的表起個名字,給保存起來。
In [19]: iris = o.get_table('pyodps_iris')In [23]: room.store('iris_test', iris, desc='保存測試ODPS對象')
In [28]: room['iris_test'] Out[28]: odps.Table name: odps_test_sqltask_finance.
pyodps_iris
schema: sepallength : double
sepalwidth : double
petallength : double
petalwidth : double
name : stringIn [29]: room.iris_test Out[29]: odps.Table name: odps_test_sqltask_finance.
pyodps_iris
schema: sepallength : double
sepalwidth : double
petallength : double
petalwidth : double
name : string</pre>這兩種方式都可以取到保存的ODPS對象。如果要列出當前room保存的所有ODPS對象,則可以:
In [30]: room.display() Out[30]: default desc name iris_test 保存測試ODPS對象 iris 安德森鳶尾花卉數據集也可以使用IPython插件命令:
In [31]: %stores Out[31]: default desc name iris_test 保存測試ODPS對象 iris 安德森鳶尾花卉數據集要刪除某個ODPS對象:
In [32]: room.drop('iris_test')In [33]: %stores Out[33]: default desc name
iris 安德森鳶尾花卉數據集</pre>執行SQL命令
PyOdps提供了 執行SQL的方法 ,但是在交互式環境下卻不甚方便。使用PyOdps提供的IPython插件,可以通過sql命令來直接執行。
在執行時,需要配置全局帳號,如果已經使用了 enter 方法或者命令,則已經配置;如果沒有,則會嘗試enter默認的room;如果這也沒有配置,則需要使用 to_global 方法。
In [34]: o = ODPS('your-access-id', 'your-secret-access-key', project='your-project', endpoint='your-end-point'))In [35]: o.to_global()</pre>
這時我們就可以使用sql命令,單個百分號輸入單行SQL,多行SQL使用兩個百分號:
In [37]: %sql select * from pyodps_iris limit 5 |==========================================| 1 / 1 (100.00%) 3s Out[37]: sepallength sepalwidth petallength petalwidth name 0 5.1 3.5 1.4 0.2 Iris-setosa 1 4.9 3.0 1.4 0.2 Iris-setosa 2 4.7 3.2 1.3 0.2 Iris-setosa 3 4.6 3.1 1.5 0.2 Iris-setosa 4 5.0 3.6 1.4 0.2 Iris-setosaIn [38]: %%sql ....: select * from pyodps_iris ....: where sepallength < 5 ....: limit 5 ....: |==========================================| 1 / 1 (100.00%) 15s Out[38]: sepallength sepalwidth petallength petalwidth name 0 4.9 3.0 1.4 0.2 Iris-setosa 1 4.7 3.2 1.3 0.2 Iris-setosa 2 4.6 3.1 1.5 0.2 Iris-setosa 3 4.6 3.4 1.4 0.3 Iris-setosa 4 4.4 2.9 1.4 0.2 Iris-setosa</pre>
在Jupyter Notebook里,多行SQL會提供語法高亮:
![]()
持久化pandas DataFrame為ODPS表
使用 persist 命令即可:
In [42]: import pandas as pd在交互式環境下,我們repr一個ODPS表的時候,會打印這個表的schema,包括字段注釋,省去了查這個表的meta信息。
In [41]: o.get_table('china_stock', project='odpsdemo') Out[41]: odps.Table name: odpsdemo.`china_stock` schema: d : string # 日期 c : string # 股票代碼 n : string # 股票名稱 t_close : double # 收盤價 high : double # 最高價 low : double # 最低價 opening : double # 開盤價 l_close : double # 昨日收盤價 chg : double # 漲跌額 chg_pct : double # 漲跌幅 vol : bigint # 成交量 turnover : double # 成交額 partitions: code : string # 股票代碼當使用sql命令或者使用DataFrame框架計算的時候,在終端或者Jupyter Notebook里都提供一個進度條來方便用戶來查看執行進度。
![]()
后記
PyOdps現在處于快速迭代階段,我們所有的開發都是開源的。大家如果需要什么功能,可以給我們提issue( GitHub );也可以直接參與到開發,直接給我們發Pull Request就行啦。
歡迎大家一起來建設PyOdps。