Python 語言支援 UDFs - Amazon Redshift

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

Python 語言支援 UDFs

您可以根UDF據 Python 編程語言創建自定義。Python 2.7 標準程式庫可在中使用UDFs,但下列模組除外:

  • ScrolledText

  • Tix

  • Tkinter

  • tk

  • turtle

  • smtpd

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

您也可以匯入自己的自訂 Python 模組,並UDFs透過執行CREATE LIBRARY指令讓它們在中使用。如需詳細資訊,請參閱匯入自訂 Python 程式庫模組

重要

Amazon Redshift 會透UDFs過封鎖對檔案系統的所有網路存取和寫入存取。

注意

Python 3 不可用於 Python UDFs。要獲得對 Amazon Redshift 的 Python 3 支持UDFs,請創建一個標量 Lambda 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 使用者指南》中的建立儲存貯體

在此範例中,假設您建立UDFs來處理資料中的位置和距離。從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;

請注意,會複製先前函數中的幾行程式碼。這種重複是必要的,因為 a 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用戶端工具執行下列命令以安裝程式庫。Replace (取代) <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 會從本節中的原始函數中刪除重複的程式碼。您可以多重複使用此程式庫提供的功能UDFs。請注意,若要匯入模組,您只需要指定子套件和模組名稱的路徑 (trig/line)。