Duckdb ، میزهای S3 با کوه یخ با استفاده از Iceberg Rest API API

من مقاله قبلی خود را در مورد Duckberg ، ترکیبی از Pyiceberg با DuckDB برای دسترسی به میزهای Iceberg در AWS نوشتم.
اما در PI-Day (3 مارس) DuckDB پیش نمایش را با ادغام چسب بیدبرگ بومی برای خواندن و نوشتن منتشر کرد. من به شما نشان می دهم که چگونه این کار می کند
AWS ، ایجاد سطل جدول S3
- S3 را باز کنید
- سطل جدول را انتخاب کنید
- یک بار ادغام با خدمات AWS Analytics را یک بار فعال کنید.
- سطل میز ایجاد کنید
- به آن اسم بدهید مانند
testtablebucket
AWS ، ایجاد جدول S3
- سطل ایجاد شده را قبل از آن انتخاب کنید
- روی ایجاد جدول با آتنا کلیک کنید
- فضای نام را ایجاد کنید یا یک مورد موجود را انتخاب کنید. این شبیه به یک پایگاه داده چسب است ، اما یکسان نیست. ایجاد کردن
testnamespace
- این آتنا را باز می کند
- اگر قبلاً این کار را نکردید ، یک سطل ایجاد کنید و کارگروه را ویرایش کنید تا از این سطل به عنوان محل خروجی استفاده کنید
- بیانیه جدول ایجاد را اجرا کنید
-
CREATE TABLE `testnamespace`.daily_sales (
sale_date date,
product_category string,
sales_amount double)
PARTITIONED BY (month(sale_date))
TBLPROPERTIES ('table_type' = 'iceberg')
- یک پرس و جو جدید برای وارد کردن برخی از مقادیر آزمون ایجاد کنید
INSERT INTO daily_sales
VALUES
(DATE '2024-01-15', 'Laptop', 900.00),
(DATE '2024-01-15', 'Monitor', 250.00),
(DATE '2024-01-16', 'Laptop', 1350.00),
(DATE '2024-02-01', 'Monitor', 300.00),
(DATE '2024-02-01', 'Keyboard', 60.00),
(DATE '2024-02-02', 'Mouse', 25.00),
(DATE '2024-02-02', 'Laptop', 1050.00),
(DATE '2024-02-03', 'Laptop', 1200.00),
(DATE '2024-02-03', 'Monitor', 375.00);
- آزمایش کنید که داده ها به درستی بارگیری شده اند
SELECT
product_category,
COUNT(*) as units_sold,
SUM(sales_amount) as total_revenue,
AVG(sales_amount) as average_price
FROM daily_sales
WHERE sale_date BETWEEN DATE '2024-02-01' and DATE '2024-02-29'
GROUP BY product_category
ORDER BY total_revenue DESC;
duckdb ، راه اندازی
این به دنبال وبلاگ DuckDB است.
اعتبار را در کنسول خود تنظیم کنید. export AWS_PROFILE=myuser
یا اعتبار کلیدی AWS
اطمینان حاصل کنید که DuckDB 1.21 یا جدیدتر نصب شده اید.
WebInterface جدید DuckDB را با: duckdb -ui
FORCE INSTALL aws FROM core_nightly;
FORCE INSTALL httpfs FROM core_nightly;
FORCE INSTALL iceberg FROM core_nightly;
CREATE SECRET (
TYPE s3,
PROVIDER credential_chain
);
ATTACH 'arn:aws:s3tables:eu-west-1::bucket/testtablebucket'
AS s3_tables_db (
TYPE iceberg,
ENDPOINT_TYPE s3_tables
);
شناسه حساب خود را جایگزین کنید و از سطل صحیح جدول S3 استفاده کنید
دویدن SHOW ALL TABLES;
برای مشاهده جداول داخلی و جداول S3 موجود
duckdb ، داده های پرس و جو
اجرا: FROM s3_tables_db.testnamespace.daily_sales;
duckdb ، داده ها را تغییر دهید
در Blogpost گزینه ای برای استفاده از Alter Table وجود دارد ، با کمال تاسف من هنوز دریافت می کنم: Not implemented Error: Alter Schema Entry
alter table s3_tables_db.testnamespace.daily_sales
add column test STRING;
شاید این فقط در روش استراحت کوه یخ کار کند.
duckdb ، کاتالوگ را از طریق کوه یخ وصل کنید
مراحل قبل از دسترسی به جداول به طور مستقیم روی میزهای S3 ، اما آخرین برنامه همچنین از API Iceberg REST از CATALOG GLUE/AWS Sagemaker Lakehouse پشتیبانی می کند تا از طریق یک روش استاندارد به داده ها دسترسی پیدا کند
ATTACH '311141556126:s3tablescatalog/testnamespace'
AS glue_db (
TYPE iceberg,
ENDPOINT_TYPE glue
);
show all tables;
به من می دهد:
IO Error: Failed to query https://glue.eu-central-1.amazonaws.com/iceberg/v1/catalogs/311141556126:s3tablescatalog:testnamespace/namespaces, http error 404 thrown. Message: {"error":{"code":404,"message":"Catalog not found.","type":"EntityNotFoundException"}}
فیلمنامه Pyiceberg من فقط داده های چسب را نیز می بیند. فضای نام S3Table نیست.
region = 'eu-west-1'
rest_catalog = load_catalog(
"testnamespace",
**{
"type": "rest",
"uri": f"https://glue.{region}.amazonaws.com/iceberg",
"rest.sigv4-enabled": "true",
"rest.signing-name": "glue",
"rest.signing-region": region
}
)
print(rest_catalog.list_namespaces())
زمان برخی تحقیقات بیشتر