PyODPS是阿里云開發的Python SDK,用于在本地環境上使用MaxCompute服務。本文將介紹如何在本地環境上使用PyODPS進行表操作、數據加載和運行SQL查詢。
前提條件
主要流程
打開Python編輯器,并創建一個Python文件。
說明若本地未安裝Python編輯器,可直接創建一個后綴名為
.py
的文件。開發PyODPS任務代碼。
創建完成后,您可參考下文內容進行簡單示例的操作學習,了解PyODPS的主要能力維度。
更多PyODPS的使用指導請參見基本操作概述、DataFrame概述。您也可以參考示例文檔:使用PyODPS節點進行結巴中文分詞,進行一個端到端的簡單操作。
本地運行python文件。
創建ODPS入口
您需要手動定義ODPS入口,代碼示例如下。
import os
from odps import ODPS
# 確保 ALIBABA_CLOUD_ACCESS_KEY_ID 環境變量設置為用戶 Access Key ID,
# ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境變量設置為用戶 Access Key Secret,
o = ODPS(
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
project='your-default-project',
endpoint='your-end-point',
)
其中:
ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET:需將該環境變量設置為您的阿里云賬號的AccessKey ID和 AccessKey Secret。環境變量設置方法請參見在Linux、macOS和Windows系統配置環境變量。
說明不建議直接使用AccessKey ID和 AccessKey Secret字符串。
your-default-project和your-end-point:需替換為您設置的默認項目名稱與Endpoint信息,各地域的Endpoint請參見Endpoint。
執行SQL
您可以在本地PyODPS節點中執行SQL命令,并讀取SQL運行結果。
在PyODPS節點中執行SQL命令
您可以在PyODPS節點中使用傳統模式或查詢加速(MCQA)執行SQL命令,當前主要支持運行DDL、DML類型的SQL命令。與傳統模式相比,加速查詢模式(MCQA)會將作業的運行結果寫入臨時緩存中。當您后續執行相同的查詢作業時,MaxCompute會優先返回緩存中的結果,加快執行速度,相關計費規則請參見計算費用(按量付費),您可根據需要選擇相應的模式執行。
可以執行的SQL語句并非都可以通過入口對象的execute_sql()
和run_sql()
等方法執行。在調用非DDL或非DML語句時,請使用其他方法。例如,調用創建表語句時,請使用create_table
方法;調用API命令時,請使用run_xflow
或execute_xflow
方法。
使用傳統模式執行SQL命令
您可以使用execute_sql()/run_sql()來執行SQL命令,示例如下:
使用create_table
方法創建一個新的表。
o.create_table('my_t', 'num bigint, id string', if_not_exists=True)
使用execute_sql
方法執行SQL查詢。
result = o.execute_sql('SELECT * FROM pyodps_iris LIMIT 3')
with result.open_reader() as reader:
for record in reader:
print(record)
使用加速查詢模式(MCQA)執行SQL命令
MCQA是MaxCompute提供的查詢加速功能,支持使用獨立資源池對中小規模數據進行加速。PyODPS從V0.11.4.1版本開始支持以下列方式通過MCQA執行SQL。
execute_sql_interactive(fallback='all'):通過MCQA執行SQL并返回MCQA Instance。如果MCQA無法執行相應的SQL,會自動回退到傳統模式。此時,函數返回的Instance為回退后的Instance。
o.execute_sql_interactive('SELECT * FROM dual', fallback='all')
如果不希望回退,可以指定參數fallback=False
。也可以指定為回退策略(或回退策略的組合,使用逗號分隔的字符串)。可用的策略名如下,默認策略為unsupported,upgrading,noresource,timeout
。為使回退一直生效,建議設置為all
,即generic,unsupported,upgrading,noresource,timeout
的組合。
回退策略 | 描述 |
generic | 指定時,表示發生未知錯誤時回退到傳統模式。 |
noresource | 指定時,表示發生資源不足問題時回退到傳統模式。 |
upgrading | 指定時,表示升級期間回退到傳統模式。 |
timeout | 指定時,表示執行超時時回退到傳統模式。 |
unsupported | 指定時,表示遇到MCQA不支持的場景時回退到傳統模式。 |
例如,下述代碼表示通過MCQA執行SQL,如果遇到不支持MCQA的場景或資源不足問題,回退到傳統模式。
o.execute_sql_interactive('SELECT * FROM dual', fallback="noresource,unsupported")
在PyODPS節點中讀取SQL運行結果
您可以使用open_reader()來讀取SQL命令運行結果。具體操作請參見讀取SQL執行結果。
更多PyODPS節點的SQL相關操作詳情請參見SQL。
DataFrame
PyODPS提供了DataFrame API,支持您使用DataFrame進行數據處理,更多DataFrame的操作示例請參見DataFrame概述。
執行
打印詳細信息
默認情況下,本地環境的PyODPS節點運行過程不會打印Logview等詳細過程。您可以手動設置
options.verbose
選項,開啟打印Logview等詳細過程。from odps import options options.verbose = True
設置運行參數hints
運行任務時如果需要設置運行時參數,可以通過設置hints
參數來實現,參數類型是dict。
o.execute_sql('SELECT * FROM pyodps_iris', hints={'odps.sql.mapper.split.size': 16})
您也可以對全局設置sql.setting,設置后后續每次運行時都會添加相關的運行時參數。
from odps import options
options.sql.settings = {'odps.sql.mapper.split.size': 16}
# 會根據全局配置添加hints
o.execute_sql('SELECT * FROM pyodps_iris')
完整示例
本地創建
test-pyodps-local.py
文件。寫入示例代碼。
import os from odps import ODPS # 確保 ALIBABA_CLOUD_ACCESS_KEY_ID 環境變量設置為用戶 Access Key ID, # ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境變量設置為用戶 Access Key Secret, o = ODPS( os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'), os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'), project='your-default-project', endpoint='your-end-point', ) # 以直接指定字段名以及字段類型的方式創建非分區表my_new_table。 table = o.create_table('my_new_table', 'num bigint, id string', if_not_exists=True) # 向非分區表my_new_table中插入數據。 records = [[111, 'aaa'], [222, 'bbb'], [333, 'ccc'], [444, '中文']] o.write_table(table, records) # 讀取非分區表my_new_table中的數據。 for record in o.read_table(table): print(record[0], record[1]) # 以運行SQL的方式讀取表中的數據。 result = o.execute_sql('SELECT * FROM pyodps_iris LIMIT 3;', hints={'odps.sql.allow.fullscan': 'true'}) # 刪除表以清除資源。 table.drop() print('使用open_reader方式讀取pyodps_iris表數據:') # 讀取SQL執行結果。 with result.open_reader() as reader: for record in reader: print(record[0], record[1])
運行python代碼。
python test-pyodps-local.py
運行結果:
111 aaa 222 bbb 333 ccc 444 中文 使用open_reader方式讀取pyodps_iris表數據: 4.9 3.0 4.7 3.2 4.6 3.1