Trang này mô tả cách tích hợp bảng BigQuery vào quy trình công việc của Earth Engine dưới dạng đối tượng ee.FeatureCollection
, bằng cách sử dụng các phương thức ee.FeatureCollection.loadBigQueryTable()
và ee.FeatureCollection.runBigQuery()
.
Tải dữ liệu từ BigQuery
Hàm ee.FeatureCollection.loadBigQueryTable()
sẽ đọc liền mạch một bảng BigQuery vào đối tượng
ee.FeatureCollection
. Phương thức này kết nối với một bảng đã chỉ định, chuyển đổi tất cả các loại dữ liệu, áp dụng các bộ lọc và bộ chọn cần thiết, đồng thời thêm hoạt động lập chỉ mục vào tập hợp nếu cần. Hàm này sử dụng môi trường tương tác của Earth Engine, trả về kết quả trực tiếp cho ứng dụng để xem hoặc sử dụng làm thành phần của một phân tích lớn hơn.
JavaScript
// Load the BigQuery table with a specified geometry column. var features = ee.FeatureCollection.loadBigQueryTable({ table: 'my_project.my_dataset.my_table', geometryColumn: 'geo' }); // Display features on the map. Map.addLayer(features);
Python
# Load the BigQuery table with a specified geometry column. features = ee.FeatureCollection.loadBigQueryTable( table='my_project.my_dataset.my_table', geometryColumn='geo') # Display the first feature. display(features.first().getInfo())
Thanh toán
Chi phí của giờ EECU được sử dụng trong quá trình xử lý yêu cầu sẽ được tính cho phương thức gọi như đối với mọi phương thức Earth Engine khác (xem Tổng quan về EECU).
Bạn sẽ không phải trả thêm chi phí BigQuery khi chuyển dữ liệu sang Earth Engine. Mức sử dụng BigQuery tương ứng sẽ xuất hiện trong Trang tổng quan về API Google Cloud của dự án đã sử dụng (xem phần Theo dõi mức sử dụng API), nhưng bạn sẽ không phải trả phí để đọc dữ liệu BigQuery theo cách này.
Truy vấn dữ liệu từ BigQuery
Phương thức ee.FeatureCollection.runBigQuery()
chạy một truy vấn SQL BigQuery và trả về kết quả dưới dạng đối tượng ee.FeatureCollection
(xem tài liệu về cách chạy truy vấn để tìm hiểu thêm về truy vấn).
JavaScript
// Construct a BigQuery query. var query = 'SELECT * FROM my_project.my_dataset.my_table WHERE column > 1000'; // Run the query and return the results as a FeatureCollection. var features = ee.FeatureCollection.runBigQuery(query); // Print the first feature. print(features.first());
Python
# Construct a BigQuery query. query = 'SELECT * FROM my_project.my_dataset.my_table WHERE column > 1000' # Run the query and retrieve the results as a FeatureCollection. features = ee.FeatureCollection.runBigQuery(query) # Print the first feature. print(features.first().getInfo())
Truy vấn BigQuery
Mỗi lệnh gọi đến ee.FeatureCollection.runBigQuery()
sẽ bắt đầu một công việc truy vấn BigQuery riêng biệt (xem thêm về các truy vấn trong tài liệu về cách chạy truy vấn), cho phép bạn sử dụng các tính năng chính của BigQuery:
- Nhật ký công việc: Xem nhật ký 6 tháng về các lần thực thi truy vấn của dự án (xem thêm tại phần Liệt kê công việc).
- Lưu truy vấn vào bộ nhớ đệm: BigQuery tự động lưu kết quả truy vấn vào bộ nhớ đệm khi có thể. Các truy vấn giống nhau tiếp theo sẽ truy xuất dữ liệu từ bộ nhớ đệm, giúp tránh các khoản phí thừa (xem thêm tại phần Sử dụng kết quả truy vấn được lưu vào bộ nhớ đệm)
Để tìm hiểu về truy vấn hoặc cách sử dụng truy vấn trong BigQuery, hãy xem tài liệu về BigQuery.
Thanh toán
Chi phí của EECU được sử dụng trong quá trình xử lý yêu cầu sẽ được tính cho phương thức gọi như đối với mọi phương thức Earth Engine khác (xem Tổng quan về EECU). Ngoài ra, việc chạy truy vấn sẽ được tính phí cho phương thức gọi theo mô hình thanh toán của BigQuery.
Bạn sẽ không phải trả thêm chi phí BigQuery khi chuyển dữ liệu sang Earth Engine. Mức sử dụng BigQuery tương ứng sẽ xuất hiện trong Trang tổng quan về API Google Cloud của dự án đã sử dụng (xem phần Theo dõi mức sử dụng API), nhưng bạn sẽ không phải trả phí để đọc dữ liệu BigQuery theo cách này.
Để kiểm soát các chi phí tiềm ẩn liên quan đến ee.FeatureCollection.runBigQuery()
, tham số maxBytesBilled
đóng vai trò là biện pháp bảo vệ. Mọi công việc BigQuery vượt quá hạn mức này sẽ không thành công và không được tính phí. Giá trị mặc định của maxBytesBilled
là 100 GB. Nếu lệnh gọi của bạn bị chặn do vượt quá giới hạn này, bạn có thể chỉ định một giá trị khác trong tập lệnh.
Điều kiện tiên quyết và quyền
Để sử dụng tính năng này, dự án trên Google Cloud của phương thức gọi cần bật BigQuery API và BigQuery Storage API. Làm theo hướng dẫn trên trang Bật API để bật các API thích hợp.
Ngoài các vai trò và quyền tiêu chuẩn của Earth Engine, bạn cần có quyền đọc trên bảng BigQuery được tham chiếu, quyền tạo phiên đọc và công việc trong dự án mục tiêu. Các quyền cụ thể cần thiết đối với BigQuery là:
bigquery.tables.get
(trên bất kỳ bảng nào được truy cập)bigquery.tables.getData
(trên bất kỳ bảng nào được truy cập)bigquery.readSession.create
bigquery.jobs.create
Hãy tham khảo tài liệu về tính năng kiểm soát quyền truy cập của BigQuery để biết thông tin chi tiết về cách quản lý quyền.
Tính năng lọc dữ liệu
Bạn có thể lọc mọi ee.FeatureCollection
bằng phương thức .filter(Filter)
. Để cho phép người dùng Google Earth Engine hưởng lợi từ quy trình xử lý dữ liệu dạng bảng BigQuery được phân song song cao, chúng tôi dịch các bộ lọc Earth Engine sang ngôn ngữ mà BigQuery có thể hiểu được và gửi các bộ lọc đó cùng với yêu cầu đọc bảng. Phương pháp này thực sự di chuyển quá trình xử lý bộ lọc sang ngăn xếp BigQuery, nhưng cũng có hai hạn chế:
Giống như mọi truy vấn khác trong BigQuery (xem hạn mức BigQuery), yêu cầu này chỉ được giới hạn ở kích thước 10 MB. Điều này có nghĩa là các bộ lọc đã truyền không được quá phức tạp. Khi đạt đến giới hạn 10 MB, bạn sẽ gặp lỗi sau:
Filter sent to BigQuery is too long. This error may be caused by too complicated geometry in geometry filters. Consider simplifying the filter and used values.
Lọc theo các hình học chứa nhiều đỉnh là nguyên nhân phổ biến gây ra lỗi này. Để giải quyết vấn đề này, hãy cân nhắc sử dụng ee.Geometry.simplify() trên đối tượng có vấn đề.
Một số bộ lọc Earth Engine phức tạp hơn không thể chuyển đổi sang các bộ lọc tương đương trong BigQuery. Ví dụ: BigQuery không hỗ trợ tính năng kiểm tra tính đồng nhất của ARRAY. Trong những trường hợp như vậy, chúng ta không dịch bộ lọc mà áp dụng bộ lọc đó trong Earth Engine sau khi đọc dữ liệu.
Lập chỉ mục dữ liệu
Các tập hợp Earth Engine dựa vào việc lập chỉ mục nội bộ, trong khi BigQuery không khuyến khích việc lập chỉ mục bảng. Để hai hệ thống đó hoạt động cùng nhau, chúng ta tạo các chỉ mục tập hợp theo cách sau:
Nếu bảng BigQuery chứa một cột có tên là
system:index
, chúng ta sẽ sử dụng cột đó để lập chỉ mục FeatureCollection.Trong những trường hợp như vậy, phương thức gọi phải đảm bảo các chỉ mục là duy nhất. Nếu không, bộ sưu tập có thể hoạt động không đúng cách theo cách không mong muốn. Chỉ mục tính năng phải là một chuỗi không trống, vì vậy, việc tải bảng BigQuery có giá trị không phải chuỗi hoặc
null
cho cộtsystem:index
sẽ không thành công.Nếu bảng BigQuery không chứa cột
system:index
, thì cột này sẽ được tạo tự động.Các chỉ mục giữa hai yêu cầu đọc là ổn định, nhưng chỉ khi các yêu cầu giống hệt nhau, có tính đến bộ lọc. Nếu không, chúng ta không thể dựa vào các chỉ mục để tương ứng với cùng một đặc điểm. Do đó, nếu việc lập chỉ mục dữ liệu duy nhất một cách chính xác là quan trọng đối với phương thức gọi, bạn nên thêm cột
system:index
trong BigQuery theo cách thủ công.
Các điểm hạn chế
Kích thước của tất cả cột đã chọn trong bảng được tham chiếu trong lệnh gọi
ee.FeatureCollection.loadBigQueryTable()
bị giới hạn ở mức 400 GB. Khi đạt đến giới hạn này, bạn sẽ gặp lỗi sau:Failed to read table from BigQuery: Requested data size is too large to read. Consider using selectors to specify only required columns.
Trong những trường hợp như vậy, hãy cân nhắc việc chọn bộ chọn hạn chế hơn cho các cột cần thiết chỉ có thể đọc hoặc cân nhắc sử dụng
ee.FeatureCollection.runBigQuery()
để xử lý trước bảng trong BigQuery và giảm lượng dữ liệu được tìm nạp.Phương thức
ee.FeatureCollection.runBigQuery()
đặt giới hạn 10 GB cho kích thước kết quả truy vấn. Mặc dù bảng nguồn có thể có kích thước tuỳ ý, nhưng việc xử lý khối lượng dữ liệu lớn hơn sẽ làm tăng chi phí truy vấn.Kích thước bộ lọc đã dịch được giới hạn ở mức 10 MB. Hãy xem phần Lọc dữ liệu để biết thông tin chi tiết.
Chú ý
ee.FeatureCollection.loadBigQueryTable()
không hỗ trợ tài nguyên từ Tập dữ liệu được liên kết. Việc cố gắng tải dữ liệu từ bảng như vậy sẽ dẫn đến lỗi "không tìm thấy bảng".Để khắc phục, hãy cân nhắc chạy
ee.FeatureCollection.runBigQuery()
bằng một truy vấn chỉ định bảng được yêu cầu từ tập dữ liệu được liên kết. Ví dụ:JavaScript
var features = ee.FeatureCollection.runBigQuery({ query: 'SELECT * FROM my_project.my_linked_dataset.my_table', geometryColumn: 'geo' });
Python
features = ee.FeatureCollection.runBigQuery( query='SELECT * FROM my_project.my_linked_dataset.my_table', geometryColumn='geo')
Việc kết hợp trên
system:index
cho các bảng BigQuery có mã nhận dạng được tạo tự động có thể dẫn đến các hành vi không mong muốn. Để tránh điều này, hãy cân nhắc thêmsystem:index
vào bảng BigQuery theo cách thủ công hoặc kết hợp bảng trên một tài sản khác. Hãy đọc thêm về việc lập chỉ mục trong phần Lập chỉ mục dữ liệu.Phương thức
ee.FeatureCollection.randomColumn()
không hoạt động với mã nhận dạng do BigQuery tự động tạo. Cân nhắc chỉ định một khoá thay thế bằng tham sốrowKeys
trong phương thứcee.FeatureCollection.randomColumn()
. Bạn cũng có thể thêm cộtrandom
hoặcsystem:index
vào bảng nguồn BigQuery theo cách thủ công. Hãy đọc thêm về việc lập chỉ mục trong phần Lập chỉ mục dữ liệu.