套用 SQL 轉換

重要

Machine Learning 工作室 (傳統) 的支援將於 2024 年 8 月 31 日結束。 建議您在該日期之前轉換成 Azure Machine Learning

自 2021 年 12 月 1 日起,您將無法建立新的 Machine Learning 工作室 (傳統) 資源。 在 2024 年 8 月 31 日之前,您可以繼續使用現有的 Machine Learning 工作室 (傳統) 資源。

ML 工作室 (傳統) 文件即將淘汰,未來將不再更新。

針對輸入資料集執行 SQLite 查詢以轉換資料

類別: 資料轉換/操作

注意

適用于僅限機器學習 Studio (傳統)

Azure Machine Learning 設計工具中提供類似的拖放模組。

模組概觀

本文描述如何使用機器學習 Studio (傳統) 中的「套用SQL 轉換模組,在輸入資料集或資料集上指定 SQL 查詢。

當您需要以複雜的方式修改資料,或保存要在其他環境中使用的資料時,SQL 很方便。 例如,使用「套用SQL 轉換模組,您可以:

  • 建立結果的資料表,並將資料集儲存在可攜式 SQLite 資料庫中。

  • 資料型別,在執行自訂轉換,或建立彙總。

  • 執行 SQL 查詢陳述式來篩選或改變資料並傳回查詢結果為資料表。

重要

此課程模組中使用的 SQL 引擎是SQLite。 如果您不熟悉 SQLite 語法,請務必閱讀本文的 語法和使用 方式一節,以取得範例。

什麼是 SQLite?

SQLite 是 C 程式設計程式庫中包含的一個公用網域關聯式資料庫管理系統。 SQLite 常用來做為在網頁瀏覽器中進行本機儲存時所使用的內嵌資料庫。

SQLite 原先設計在 2000 中的美國海軍,以支援無伺服器的交易。 它是一個獨立的資料庫引擎有沒有管理系統,因此不需要組態或管理。

如何設定套用 SQL 轉換

此模組最多可能需要以三個資料集做為輸入。 當您參考的資料集各連線到每個輸入連接埠時,必須使用名稱 t1t2t3。 這些數字表示輸入連接埠的索引。

其餘的參數是 SQL 查詢,會使用 SQLite 語法。 此模組支援 SQLite 語法的所有標準陳述式。 關於不支援的陳述式清單,請參閱技術提示一節。

一般語法和使用方式

  • 在 [SQL 指令碼] 文字輸入框中輸入多行時,請使用分號終止每個陳述式。 否則,插入換行符號會轉換成空格。

    例如,下列陳述式是相等的:

    SELECT   
    *   
    from   
    t1;  
    
    SELECT * from t1;  
    
  • 您可以使用 -- 每一行開頭的,或使用 /* */ 來封入文字,來新增批註。

    例如,此陳述式是有效的:

    SELECT * from t1  
    /*WHERE ItemID BETWEEN 1 AND 100*/;  
    
  • 如果資料行名稱重複保留關鍵字的名稱,則會將語法醒目提示套用至SQL 腳本文字方塊內的文字。 為了避免混淆,您應該以方括弧括住資料行名稱, (遵循 SQL 的慣例) 或倒引號或雙引號 (ANSI SQL 慣例) 。

    例如,在下列的血糖捐贈資料集查詢中, Time 是有效的資料行名稱,但也是保留關鍵字。

    SELECT Recency, Frequency, Monetary, Time, Class  
    FROM t1  
    WHERE Time between 3 and 20;  
    

    如果您依原樣執行查詢,查詢可能會傳回正確的結果,但視資料集而定,它可能會傳回錯誤。 以下是一些如何避免此問題的範例:

    -- Transact-SQL  
    SELECT [Recency], [Frequency], [Monetary], [Time], [Class]  
    FROM t1  
    WHERE [Time] between 3 and 20;  
    -- ANSI SQL  
    SELECT "Recency", "Frequency", "Monetary", "Time", "Class"  
    FROM t1  
    WHERE `Time` between 3 and 20;  
    

    注意

    語法醒目提示會保留在關鍵字上,即使是以引號或括弧括住。

  • SQLite 不 區分大小寫,但有幾個命令具有不同意義的區分大小寫變數 (GLOB 與 GLOB) 。

SELECT 陳述式

SELECT在語句中,在識別碼中包含空格或其他字元的資料行名稱,必須用雙引號括住、方括弧或倒引號字元 (') 。

例如,此查詢會參考上 t1 Two-Class 鳶尾花資料集,但一個資料行名稱包含禁止的字元,因此資料行名稱會以引號括住。

SELECT class, "sepal-length" FROM t1;  

您可以加入 WHERE 子句來篩選資料集中的值。

SELECT class, "sepal-length" FROM t1 WHERE "sepal-length" >5.0;  

SQLite 語法不支援在 SQL Transact-sql 中使用的 TOP 關鍵字。 相反地,您可以使用 LIMIT 關鍵字或 FETCH 語句。

例如,比較自行車出租資料集的這些查詢。

-- unsupported in SQLite  
SELECT  TOP 100 [dteday] FROM t1 ;  
ORDER BY [dteday] DESC;  
  
-- Returns top 100   
SELECT  [dteday] FROM t1 LIMIT 100 ;  
ORDER BY [dteday] DESC;  
  
-- Returns top 100. Note that FETCH is on a new line.  
SELECT  [dteday] FROM t1 - ;  
FETCH FIRST 100 rows ONLY;  
ORDER BY [dteday] DESC;  

聯結

下列範例會使用餐廳評等資料集上相符的輸入連接埠t1,和輸入連接埠對應到餐廳功能 dataset t2

下列陳述式聯結兩個資料表建立指定的餐廳功能結合為每一家餐廳的平均評等的資料集。

SELECT DISTINCT(t2.placeid),    
t2.name, t2.city, t2.state, t2.price, t2.alcohol,  
AVG(rating)  AS 'AvgRating'   
FROM t1   
JOIN t2  
ON t1.placeID = t2.placeID  
GROUP BY t2.placeid;  

彙總函式

本節提供一些常見 SQL 彙總函式的基本範例,使用 SQLite。

目前支援的彙總函式如下: AVGCOUNTMAXMINSUMTOTAL

下列查詢會傳回集,其中包含餐廳識別項,以及餐廳的平均等級。

SELECT DISTINCT placeid,  
AVG(rating) AS ‘AvgRating’,  
FROM t1  
GROUP BY placeid  

使用字串

SQLite 支援兩個管線運算子來串連字串。

下列陳述式會建立新的資料行,藉由串連兩個文字資料行。

SELECT placeID, name,   
(city || '-' || state) AS 'Target Region',   
FROM t1  

警告

不支援 transact-sql SQL 字串串連運算子: + (字串串連) 。 例如,運算式('city + '-' + state) AS 'Target Region'在範例中,查詢會傳回所有值 0。

不過,即使此資料類型不支援運算子,機器學習也不會引發錯誤。 記得要驗證的結果套用 SQL 轉換在試驗中使用產生的資料集之前。

COALESCE 和 CASE

COALESCE 依序評估多個引數,並傳回第一個運算式的值,此值不會評估為 Null。

例如,鋼鍛鍊多類別的資料集上此查詢會傳回第一個非 null 旗標,從資料行清單假設具有互斥的值。 如果沒有旗標找到,則會傳回"none"的字串。

SELECT classes, family, [product-type],  
COALESCE(bt,bc,bf,[bw/me],bl, "none") AS TemperType  
FROM t1;  

CASE語句適用于測試值,並根據評估的結果傳回新值。 SQLite 支援語句的下列語法 CASE

  • CASE WHEN [條件] 然後 [expression] ELSE [expression] 結束

  • 當案例 [expression] [value] 然後 [expression] ELSE [expression] 結束

例如,假設您先前已使用 [ 轉換成指標值 ] 模組來建立包含 true-false 值的設定特徵資料行。 下列查詢會將多個特徵資料行中的值折迭成單一多重值資料行。

SELECT userID, [smoker-0], [smoker-1],  
CASE  
WHEN [smoker-0]= '1' THEN 'smoker'   
WHEN [smoker-1]= '1' THEN 'nonsmoker'   
ELSE 'unknown'  
END AS newLabel  
FROM t1;  

範例

如需如何在機器學習實驗中使用此模組的範例,請參閱 Azure AI 資源庫中的下列範例:

  • 申請 SQL 轉換:使用餐廳評等、餐廳功能和餐廳客戶資料集來說明簡單的聯結、select 語句和彙總函式。

技術說明

本節包含實作詳細資料、提示和常見問題集的解答。

  • 連接埠 1 一律需要輸入。

  • 如果輸入資料集有資料行名稱,在輸出資料集中的資料行就會使用從輸入資料集的資料行名稱。

    如果輸入資料集沒有資料行名稱,則會使用下列命名慣例自動建立資料表中的資料行名稱: T1COL1、T1COL2、T1COL3 等,其中數位表示輸入資料集中每個資料行的索引。

  • 如果資料行識別碼包含空格或其他特殊字元,則在 SELECTWHERE 子句中參考資料行時,請一律以方括弧或雙引號括住資料行識別碼。

不支援的陳述式

雖然 SQLite 支援大部分的 ANSI SQL 標準,它不包含許多商業的關聯式資料庫系統所支援的功能。 如需詳細資訊,請參閱 SQLite 可理解的 SQL。 此外,在建立 SQL 陳述式時,請留意下列限制:

  • 不過,不像大多數的 SQL 資料庫系統,SQLite 使用動態輸入的值,而非指定類型至資料行。 它弱型別,並允許隱含型別轉換。

  • 實作 LEFT OUTER JOIN,而不是 RIGHT OUTER JOINFULL OUTER JOIN

  • 您可以使用RENAME TABLEADD COLUMN陳述式與ALTER TABLE命令,但其他子句不支援,包括DROP COLUMNALTER COLUMN,和ADD CONSTRAINT

  • 您可以建立一個檢視內 SQLite,但之後檢視是唯讀。 無法執行DELETEINSERT,或UPDATE檢視上的陳述式。 不過,您可以建立會引發觸發程序,在嘗試DELETEINSERT,或UPDATE檢視上並執行其他作業的觸發程序主體中。

除了官方 SQLite 網站所提供不支援的函數清單,下列 Wiki 提供其他不支援的功能清單:SQLite - Unsupported SQL

預期的輸入

名稱 類型 說明
Table1 資料表 輸入 dataset1
Table2 資料表 輸入 dataset2
Table3 資料表 輸入 dataset3

模組參數

名稱 範圍 類型 預設 描述
SQL 查詢指令碼 任意 StreamReader SQL 查詢陳述式

輸出

名稱 類型 說明
結果資料集 資料表 輸出資料集

例外狀況

例外狀況 描述
錯誤 0001 如果找不到資料集的一或多個指定的資料行,就會發生例外狀況。
錯誤 0003 如果有一或多個輸入資料集是 Null 或空白,就會發生例外狀況。
錯誤 0069 SQL 邏輯錯誤或遺失資料庫

如需 Studio (傳統) 模組特定的錯誤清單,請參閱機器學習錯誤碼

如需 API 例外狀況的清單,請參閱機器學習 REST API 錯誤碼

另請參閱

操作
資料轉換
A-Z 模組清單