PyODPS, MaxCompute içinde yapılandırılmış verileri işlemek için bir DataFrame API sunar. Bir DataFrame nesnesi, aynı arabirimi kullanarak dört farklı veri kaynağına — MaxCompute tabloları, MaxCompute bölümleri, Pandas DataFrames ve SQLAlchemy tabloları — başvurabilir. İşleme mantığını yeniden yazmadan yalnızca girişi değiştirerek veri kaynakları arasında geçiş yapabilirsiniz. Bu sayede kodu yerel ortamda Pandas ile geliştirip test etmek ve aynı mantığı MaxCompute üzerinde büyük ölçekte çalıştırmak kolaylaşır.
Ön koşullar
Başlamadan önce aşağıdakilerin hazır olduğundan emin olun:
MaxCompute projenizde örnek tablo
pyodps_irisbulunmalıdır. Kurulum talimatları için bkz. Verileri işlemek için DataFrame kullanma
Temel kavramlar
PyODPS'te manuel olarak oluşturmanız gereken tek Collection nesnesi DataFrame nesnesidir. Üç temel nesne türü şunlardır:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Gecikmeli değerlendirme: MaxCompute tablosundan oluşturulan bir DataFrame gerçek verileri yüklemez; gerçekleştirilecek işlemlerin temsilini tutar. Hesaplama tetiklendiğinde MaxCompute bu işlemleri yürütür ve sonuçları depolar. Buna karşılık, Pandas DataFrame'den oluşturulan bir DataFrame gerçek verileri bellekte tutar.
Veri kaynağı hızlı başvurusu
Dört oluşturma yönteminin tamamı aynı DataFrame(source) yapıcısını kullanır. Tek fark, source olarak ne aktardığınızdır.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MaxCompute tablosundan DataFrame nesnesi oluşturma
Tablo nesnesini doğrudan DataFrame öğesine aktarın veya tablo üzerinde to_df() yöntemini çağırın.
from odps.df import DataFrame
# Method 1: Pass the table object to DataFrame
iris = DataFrame(o.get_table('pyodps_iris'))
# Method 2: Use the to_df method on the table
iris2 = o.get_table('pyodps_iris').to_df()
Her iki yöntem de aynı şemaya sahip eşdeğer DataFrame nesneleri üretir.
MaxCompute bölümünden DataFrame nesnesi oluşturma
Bölüm nesnesini DataFrame öğesine aktarın veya bölüm üzerinde to_df() yöntemini çağırın.
from odps.df import DataFrame
# Create a partitioned table if one does not already exist
o.create_table('partitioned_table', ('num bigint, num2 double', 'pt string'), if_not_exists=True)
# Method 1: Pass the partition object to DataFrame
pt_df = DataFrame(o.get_table('partitioned_table').get_partition('pt=20171111'))
# Method 2: Use the to_df method on the partition
pt_df2 = o.get_table('partitioned_table').get_partition('pt=20171111').to_df()
Pandas DataFrame'den DataFrame nesnesi oluşturma
Pandas DataFrame'i DataFrame yapıcısına aktarın.
from odps.df import DataFrame
import pandas as pd
import numpy as np
df = DataFrame(pd.DataFrame(np.arange(9).reshape(3, 3), columns=list('abc')))
Veri türü çıkarımı
Bir Pandas DataFrame'i dönüştürürken PyODPS veri türlerini otomatik olarak çıkarır. Çıkarım başarısız olduğunda veya hatalı sonuç ürettiğinde tür çözümlemesini denetlemek için aşağıdaki parametreleri kullanın:
|
|
|
|
|
|
|
|
|
|
|
|
Örnek 1: Boş bir sütunu çözme ve veri türünü geçersiz kılma
df2 = DataFrame(df, unknown_as_string=True, as_type={'null_col2': 'float'})
print(df2.dtypes)
Çıktı:
odps.Schema {
sepallength float64
sepalwidth float64
petallength float64
petalwidth float64
name string
null_col1 string # unknown_as_string=True converted this to string
null_col2 float64 # as_type forced this to float
}
Örnek 2: Liste sütunu için türü ayarlama
PyODPS, list veya dict sütunları için tür çıkarmaz. Sütun adlarını türlerine eşleyen bir dict olarak as_type değerini ayarlayın.
df4 = DataFrame(df3, as_type={'list_col': 'list<int64>'})
print(df4.dtypes)
Çıktı:
odps.Schema {
id int64
list_col list<int64> # as_type is required for list and dict columns
}
PyODPS, Object Storage Service (OSS) veya Tablestore dış tablolarının MaxCompute'e yüklenmesini desteklemez.
SQLAlchemy tablosundan DataFrame nesnesi oluşturma
SQLAlchemy'i MaxCompute projenize bağlayın, ardından tablo nesnesini DataFrame öğesine aktarın. Bağlantı parametreleri için bkz. SQLAlchemy'i MaxCompute projesine bağlama.
import os
from odps.df import DataFrame
import sqlalchemy
# Build the connection string using environment variables for your AccessKey credentials.
# Set ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET before running this code.
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) # Bind metadata to the engine
table = sqlalchemy.Table('pyodps_iris', metadata, extend_existing=True, autoload=True)
iris = DataFrame(table)
Sonraki adımlar
Bir DataFrame nesnesi oluşturduktan sonra PyODPS DataFrame API'sini kullanarak veri işlemleri gerçekleştirebilirsiniz. Kullanılabilir işlemler için bkz. Verileri işlemek için DataFrame kullanma.