本文為您介紹如何建立DataFrame引用資料來源。
前提條件
操作下述程式碼範例前,您需要先準備好樣本表pyodps_iris,詳細操作請參見Dataframe資料處理。
背景資訊
在使用DataFrame時,您需要瞭解Collection
(DataFrame
)、Sequence
和Scalar
三類對象的操作。三類對象分別表示表結構(或者二維結構)、列(一維結構)和標量。
您使用Pandas建立的資料對象包含實際資料,但通過MaxCompute表建立的對象並不包含實際資料,僅包含對資料的操作。MaxCompute完成資料存放區和計算。
建立DataFrame
您唯一需要直接建立的Collection對象是DataFrame。DataFrame用於引用MaxCompute表、MaxCompute分區、Pandas DataFrame或Sqlalchemy Table(資料庫表)資料來源。這幾種資料來源的操作相同,您可以不更改資料處理代碼,僅修改輸入和輸出指向,便可以將本地啟動並執行小資料量測試代碼遷移到MaxCompute,遷移正確性由PyODPS保證。
從MaxCompute表建立DataFrame
從MaxCompute表建立DataFrame,您需要將Table對象傳入DataFrame方法,或者使用表的to_df
方法。程式碼範例如下:
from odps.df import DataFrame
# 傳入Table對象。
iris = DataFrame(o.get_table('pyodps_iris'))
# 使用表的to_df方法。
iris2 = o.get_table('pyodps_iris').to_df()
從MaxCompute分區建立DataFrame
從MaxCompute分區建立DataFrame,您需要將分區對象傳入DataFrame方法,或者使用分區的to_df
方法。程式碼範例如下:
from odps.df import DataFrame
# (可選)建立partitioned_table分區表。若已有分區表,可根據實際情況替換partitioned_table。
o.create_table('partitioned_table', ('num bigint, num2 double', 'pt string'), if_not_exists=True)
# 傳入Table對象。
pt_df = DataFrame(o.get_table('partitioned_table').get_partition('pt=20171111'))
# 使用分區的to_df方法。
pt_df2 = o.get_table('partitioned_table').get_partition('pt=20171111').to_df();
從Pandas DataFrame建立DataFrame
從Pandas DataFrame建立DataFrame,您需要將Pandas DataFrame對象傳入DataFrame方法。
程式碼範例
from odps.df import DataFrame # 從Pandas DataFrame建立DataFrame。 import pandas as pd import numpy as np df = DataFrame(pd.DataFrame(np.arange(9).reshape(3, 3), columns=list('abc')))
注意事項
用Pandas DataFrame初始化時:
PyODPS DataFrame會嘗試對NUMPY OBJECT或STRING類型進行推斷。如果一整列都為空白,則會報錯。為避免報錯,您可以設定
unknown_as_string
值為True,將這些列指定為STRING類型。您可以通過
as_type
參數,強制轉換類型。如果類型為基本類型,會在建立PyODPS DataFrame時強制轉換類型。如果Pandas DataFrame中包含LIST或DICT列,系統不會推斷該列的類型,必須手動使用as_type
指定類型。as_type
參數類型必須是DICT。
樣本:
樣本1:指定
null_col2
列類型為float
。df2 = DataFrame(df, unknown_as_string=True, as_type={'null_col2': 'float'}) print(df2.dtypes)
返回結果:
odps.Schema { sepallength float64 sepalwidth float64 petallength float64 petalwidth float64 name string null_col1 string # 無法識別,通過unknown_as_string設定成STRING類型。 null_col2 float64 # 強制轉換成FLOAT類型。 }
樣本2:指定
list_col
列類型為list<int64>
。df4 = DataFrame(df3, as_type={'list_col': 'list<int64>'}) print(df4.dtypes)
返回結果:
odps.Schema { id int64 list_col list<int64> # 無法識別且無法自動轉換,通過as_type設定。 }
說明PyODPS不支援上傳OSS或OTS外部表格。
從Sqlalchemy Table建立DataFrame
從Sqlalchemy Table建立DataFrame,您需要將Sqlalchemy Table對象傳入DataFrame方法,Sqlalchemy建立串連及相關參數說明請參見建立串連。程式碼範例如下:
from odps.df import DataFrame
import sqlalchemy
# 從Sqlalchemy Table建立DataFrame。
# 確保 ALIBABA_CLOUD_ACCESS_KEY_ID 環境變數設定為使用者 Access Key ID,
# ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境變數設定為使用者 Access Key Secret,
# 不建議直接使用 Access Key ID / Access Key Secret 字串
conn_string = 'odps://%s:%s@<project>/?endpoint=<endpoint>' % (
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET')
)
engine = sqlalchemy.create_engine(conn_string)
metadata = sqlalchemy.MetaData(bind=engine) # 需要綁定到Engine。
table = sqlalchemy.Table('pyodps_iris', metadata, extend_existing=True, autoload=True)
iris = DataFrame(table)