UDF 的 Python 語言支援 - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

UDF 的 Python 語言支援

您可以根據 Python 程式設計語言建立自訂 UDF。Python 2.7 standard library 可供 UDF 使用,但下列模組除外:

  • ScrolledText

  • Tix

  • Tkinter

  • tk

  • turtle

  • smtpd

除了 Python 標準程式庫外,下列模組是 Amazon Redshift 實作的一部分:

您也可以匯入自己的自訂 Python 模組,並執行 CREATE LIBRARY 命令,使它們可供 UDF 使用。如需詳細資訊,請參閱 匯入自訂 Python 程式庫模組

重要

Amazon Redshift 會通過 UDF 封鎖對文件系統的所有網絡訪問和寫入存取。

匯入自訂 Python 程式庫模組

您可以使用 Python 語言語法來定義純量函數。您可以使用 Python 標準庫模塊和 Amazon Redshift 預安裝的模塊。您還可以建立自己的自訂 Python 程式庫模組,並將這些程式庫導入至您的叢集,或使用 Python 或第三方的現有程式庫。

您建立的程式庫不可包含與 Python 標準程式庫模組或 Amazon Redshift 預先安裝 Python 模組同名的模組。如果現有使用者安裝的程式庫使用相同的 Python 套件做為您建立的程式庫,則您必須捨棄現有的程式庫,然後才能安裝新的程式庫。

您必須是超級使用者或具有 USAGE ON LANGUAGE plpythonu 權限,才能安裝自訂程式庫;不過,任何具有足夠權限來建立函數的使用者都可以使用已安裝的程式庫。您可以查詢 PG_LIBRARY 系統目錄,來檢視叢集上已安裝之程式庫的相關資訊。

將自訂 Python 模組匯入您的叢集

本節提供將自訂 Python 模組匯入至您的叢集的範例。若要執行本節中的步驟,您必須具有 Amazon S3 存儲桶,而您會在其中上傳程式庫套件。然後,在您的叢集中安裝套件。如需建立儲存貯體的詳細資訊,請參建立儲存貯體中的Amazon Simple Storage Service 使用者指南

在此範例中,讓我們假設您建立 UDF,來使用資料中的位置和距離。從 SQL 用户端工具 Connect 至 Amazon Redshift 叢集,並執行下列命令來建立函數。

CREATE FUNCTION f_distance (x1 float, y1 float, x2 float, y2 float) RETURNS float IMMUTABLE as $$ def distance(x1, y1, x2, y2): import math return math.sqrt((y2 - y1) ** 2 + (x2 - x1) ** 2) return distance(x1, y1, x2, y2) $$ LANGUAGE plpythonu; CREATE FUNCTION f_within_range (x1 float, y1 float, x2 float, y2 float) RETURNS bool IMMUTABLE as $$ def distance(x1, y1, x2, y2): import math return math.sqrt((y2 - y1) ** 2 + (x2 - x1) ** 2) return distance(x1, y1, x2, y2) < 20 $$ LANGUAGE plpythonu;

請注意,會複製先前函數中的幾行程式碼。需要進行此複製的原因是 UDF 無法參考另一個 UDF 的內容,而且這兩個函數都需要相同功能。然而,不是複製多個函數中的程式碼,而是您可以建立自訂程式庫,並設定您的函數來使用它。

若要這樣做,首先遵循下列步驟來建立程式庫套件:

  1. 建立名為 geometry 的資料夾。此資料夾是程式庫的最上層套件。

  2. geometry 資料夾中,建立名為 __init__.py 的檔案。請注意,檔案名稱包含兩個雙底線字元。此檔案向 Python 表示可以初始化套件。

  3. 另外,在 geometry 資料夾中,建立名為 trig 的資料夾。此資料夾是程式庫的子套件。

  4. trig 資料夾中,建立另一個名為 __init__.py 的檔案,以及一個名為 line.py 的檔案。在此資料夾中,__init__.py 向 Python 表示可以初始化子套件,而且 line.py 是包含程式庫程式碼的檔案。

    您的資料夾和檔案結構應該與下列資料夾和檔案結構相同:

    geometry/ __init__.py trig/ __init__.py line.py

    如需套件結構的詳細資訊,請前往 Python 網站上 Python 教學課程中的模組

  5. 下列程式碼包含程式庫的類別和成員函數。複製它並貼至 line.py

    class LineSegment: def __init__(self, x1, y1, x2, y2): self.x1 = x1 self.y1 = y1 self.x2 = x2 self.y2 = y2 def angle(self): import math return math.atan2(self.y2 - self.y1, self.x2 - self.x1) def distance(self): import math return math.sqrt((self.y2 - self.y1) ** 2 + (self.x2 - self.x1) ** 2)

在您建立了套件之後,請執行下列動作,來準備套件並將其上傳至 Amazon S3。

  1. geometry 資料夾的內容壓縮成名為 geometry.zip 的 .zip 檔案。不要包括 geometry 資料夾本身;只包括資料夾的內容,如下所示:

    geometry.zip __init__.py trig/ __init__.py line.py
  2. 上傳geometry.zip連接至您的 Amazon S3 儲存貯體。

    重要

    如果 Amazon S3 存儲貯體不是位於 Amazon Redshift 叢集所在的同一區域,您必須使用 REGION 選項來指定資料所在的區域。如需詳細資訊,請參閱 CREATE LIBRARY

  3. 從您的 SQL 用戶端工具中,執行下列命令來安裝程式庫。將 <bucket_name> 取代為儲存貯體的名稱,並將 <access key id><secret key> 取代為來自 AWS Identity and Access Management (IAM) 使用者登入資料的存取金鑰和私密存取金鑰。

    CREATE LIBRARY geometry LANGUAGE plpythonu FROM 's3://<bucket_name>/geometry.zip' CREDENTIALS 'aws_access_key_id=<access key id>;aws_secret_access_key=<secret key>';

在您的叢集中安裝程式庫之後,您需要設定函數來使用程式庫。若要這樣做,請執行下列命令。

CREATE OR REPLACE FUNCTION f_distance (x1 float, y1 float, x2 float, y2 float) RETURNS float IMMUTABLE as $$ from trig.line import LineSegment return LineSegment(x1, y1, x2, y2).distance() $$ LANGUAGE plpythonu; CREATE OR REPLACE FUNCTION f_within_range (x1 float, y1 float, x2 float, y2 float) RETURNS bool IMMUTABLE as $$ from trig.line import LineSegment return LineSegment(x1, y1, x2, y2).distance() < 20 $$ LANGUAGE plpythonu;

在上述命令中,import trig/line 會從本節中的原始函數中刪除重複的程式碼。您可以在多個 UDF 中使用此程式庫所提供的功能。請注意,若要匯入模組,您只需要指定子套件和模組名稱的路徑 (trig/line)。