IBM Cloud Docs
概觀

概觀

IBM Cloud® Data Engine 已淘汰。 從 2024 年 2 月 18 日開始,您無法建立新的實例,將會移除對免費實例的存取權。 在 2025 年 1 月 18 日之前,支援現有的標準方案實例。 將會刪除在該日期仍然存在的任何實例。

Data Engine 是完整受管理服務,可執行 SQL 查詢 (即 SELECT 陳述式),以讀取、分析、轉換、儲存及串流 IBM Cloud® Object Storage 及 Kafka中的資料。 您也可以在與 Hive meta 儲存庫相容的型錄中管理表格 meta 資料。 Data Engine 是 IBM Cloud®的資料湖中央服務。 結合 Data Engine 與 Object Storage 中的資料,可讓您為大量海量資料分析使用案例建立作用中工作區。

Data Engine 概觀。
圖 1. Data Engine 概觀

從位於一或多個雲端 Object Storage 實例中的 CSV、JSON、ORC、Parquet 或 AVRO 物件讀取輸入資料。 每一個查詢結果都會寫入雲端 Object Storage 或您選擇的 Db2 實例中的 CSV、JSON、ORC、Parquet 或 AVRO 物件。 使用 Data Engine 使用者介面 (UI) 來 開發查詢,並使用 Data EngineREST API 來自動化查詢。

查詢的輸入及輸出

您必須先將輸入資料上傳至一或多個雲端 Object Storage 實例,才能使用 Data Engine 服務來執行 SQL 查詢。 您還必須至少具有一個雲端 Object Storage 儲存區的「撰寫者」存取權,才能在那裡寫入結果物件 (即包含輸出資料的物件)。 如需雲端 Object Storage的相關資訊 (包括如何佈建實例、建立儲存區及上傳資料),請參閱 Cloud Object Storage 入門手冊Reading and writing to Cloud Object Storage。 您也可以 寫入資料庫,並利用 索引管理

以編程方式存取

REST API

您可以使用 Data Engine 服務 REST API 來執行查詢並擷取其狀態的相關資訊。 當您撰寫自動查詢資料的程式碼時,這特別有用。

附註:「雲端資源名稱 (CRN)」是 Data Engine REST 端點呼叫的必要組件。 「CRN 複製」按鈕會將 CRN 複製到剪貼簿,您可以將它貼到 API 呼叫中。

Python 應用程式及 Notebook

若為 Python 應用程式,您也可以使用 ibmcloudsql 套件。 使用 IBM Watson Studio,以使用 Data Engine 執行查詢,並使用 Watson Studio 中可用的各種小組件程式庫之一來視覺化查詢結果。

Cloud Functions

Data Engine 是提交 SQL 查詢的無伺服器機制,使其自然符合無伺服器 IBM Cloud Functions。 您可以使用一般 SQL Cloud 函數 來執行 Data Engine 作為 IBM Cloud 函數。

地理空間函數

Geospatial Toolkit 提供一組 地理空間函數,您可以用來有效地處理空間資料並為其編製索引。 這些函數已整合至 Data Engine 服務並備妥可供立即使用。 Data Engine 服務也提供數個範例查詢,說明如何使用這些函數。

必要的使用者角色

下表顯示啟動特定服務動作或 API 端點所需的使用者角色。 當您建立新的使用者 ID 時,請使用此資訊來決定要授與使用者哪些存取權。

表 5. 使用者角色
說明 服務動作 API 端點 必要的使用者角色
提交 SQL 查詢。 sql-query.api.submit POST/v2/sql_jobs/ 管理員或撰寫者
取得所有已提交工作的資訊。 sql-query.api.getalljobs GET/v2/sql_jobs/ 管理員、撰寫者或讀者
取得特定已提交工作的資訊。 sql-query.api.getjobinfo GET/v2/sql_jobs/{job_id} 管理員、撰寫者或讀者
提交型錄或索引管理陳述式。 sql-query.api.managecatalog POST/v2/sql_jobs/ 管理員

掃描資料的行為

Data Engine 會根據您的查詢儘可能小地讀取資料。 掃描的資料量取決於 Data Engine 必須讀取才能執行查詢的資料量,而不是資料實際大小。 在需要存取多少資料才能執行查詢時,有幾個因素會扮演一個角色。 首先,資料佈置很重要。 直欄式格式 (例如 Parquet) 會導致較少要掃描的資料,因為 Data Engine 可以選擇性地讀取範圍及單一直欄。 此外,實際物件佈置會決定需要掃描的物件數目。 如需如何在雲端 Object Storage 上佈置海量資料以改善 SQL 查詢的成本和效能的詳細資料,請閱讀 如何在 IBM Cloud Object Storage for Spark SQL 中佈置海量資料。 每一個成功的查詢至少收費 10 MB。

範例

假設您有 1 PB 儲存在雲端 Object Storage 上的資料,其佈置方式如 部落格文章 中所述,並針對您要執行的查詢進行最佳化。 如果您執行單一查詢,最昂貴的查詢可能是 SELECT * FROM,因為需要讀取 1 PB 資料。 任何其他查詢都更便宜且更快速。 例如,1 PB 資料集包含系統使用者的審核事件 (使用者 A 在系統 X 的時間 T 執行動作 B),並且以依時間分割資料的方式來佈置資料 (每天一個檔案及系統)。 因此,若要回答 SELECT DISTINCT user FROM WHERE System='X' AND Day >= (TODAY - 30) 這類查詢,Data Engine 必須存取系統 X 的所有物件,其中包含過去 30 天的資料。 這些物件的大小總和是掃描您將被收費的資料預估上限。 但由於 Data Engine 只會存取一個欄位,而且資料會儲存為 Parquet,因此它會少很多。 無法事先計算查詢的精確價格,因為它很大程度上取決於資料本身。 例如,Parquet 會儲存壓縮直欄,因此如果可以有效地壓縮直欄,則需要讀取的資料更少。 您也可以在部落格文章 Data Engine 中找到關於 Data Engine ETL 功能的部分進一步詳細資料,以及它們如何影響已掃描資料。

時間戳記

依預設,使用「世界標準時間 (UTC)」區域來建立 時間戳記 資料類型的值。 因此,例如,表示式 timestamp('2009-07-30 04:17:52')to_timestamp('2016-12-31', 'yyyy-MM-dd')current_timestamp 會全部產生「世界標準時間」時間戳記值,且輸入字串表示式會假設為「世界標準時間」。

如果您要從代表不同時區的字串表示式建立「世界標準時間」時間戳記,請使用 to_utc_timestamp,例如 to_utc_timestamp('2016-08-31', 'Asia/Seoul')

您也可以在與「世界標準時間」時間戳記值不同的時區中建立時間戳記值,或在使用 from_utc_timestamp 的「世界標準時間」字串表示式中建立時間戳記值,例如 from_utc_timestamp(current_timestamp, 'Asia/Seoul'),from_utc_timestamp('2016-08-31', 'Asia/Seoul')

限制

  • 如果 JSON、ORC 或 Parquet 物件包含巢狀或陣列結構,則具有使用萬用字元 (例如,SELECT * from cos://...) 的 CSV 輸出的查詢會傳回錯誤,例如「使用的 CSV 資料類型無效: struct<nested JSON object>」。 請使用下列其中一種暫行解決方法:

    • 若為巢狀結構,請使用 FLATTEN 表格轉換函數。 或者,您可以指定完全巢狀的直欄名稱,而不是萬用字元,例如 SELECT address.city, address.street, ... from cos://...
    • 若為陣列,請使用 Spark SQL explode () 函數,例如 select explode(contact_names) from cos://...
  • 如果您收到毀損結果,請在 SQL 陳述式中使用 'STORED AS' 來驗證來源 URI 是否正確,以及是否指定正確的輸入格式。

  • 如果您收到一則錯誤訊息,指出在輸入直欄中找不到部分直欄,但這些直欄確實存在於輸入中,請檢查 SQL 陳述式中指定為 'STORED AS' 的輸入格式是否為輸入的實際格式。

  • 若要使用 Data Engine處理 CSV 輸入,每一列必須包含在一行內。 不支援多行值。

    如果您使用 Data Engine,從其他資料格式 (例如支援值內換行的 Parquet) 產生 CSV 結果,並再次查詢這些 CSV 結果,則在撰寫結果之前必須明確地移除換行。 若要這樣做,請使用 SQL 函數 regexp_replace。 例如,Parquet 物件 data 的屬性 multi_line 包含跨越多行的值。 若要根據 condition 選取列子集並將其儲存在雲端 Object Storage 以進一步處理,Skeleton SQL 陳述式類似於下列範例:

    SELECT regexp_replace(multi_line, '[\\r\\n]', ' ') as multi_line FROM data STORED AS parquet WHERE condition