PyOdps在交互式環境下的使用,讓探索ODPS數據更容易些

MckinleyXZB 8年前發布 | 14K 次閱讀 SQL Python開發 IPython

來自: 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 setup

In [2]: setup('your-access_id', 'your-access-key', 'your-project', endpoint='your-endpoint')</pre>

此時這個帳號會被配置到一個叫做 default 的我們稱之為 room 的地方。以后我們再使用這個帳號只需要: 

In [3]: from odps.inter import enter

In [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_rooms

In [18]: list_rooms() Out[18]: ['default', 'meta']</pre>

IPython及Jupyter Notebook

PyOdps還提供了IPython插件。首先我們需要加載插件:

In [11]: %load_ext odps

In [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 : string

In [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-setosa

In [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

In [43]: df = pd.read_csv('

In [48]: %persist df pyodps_iris_test |==========================================| 150 /150 (100.00%) 0s

In [49]: from odps.df import DataFrame

In [61]: DataFrame(o.get_table('pyodps_iris_test')).head(5) |==========================================| 1 / 1 (100.00%) 0s Out[61]: 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-setosa</pre>

其它交互式方面的增強

在交互式環境下,我們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。

 本文由用戶 MckinleyXZB 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!