SnowConvert: TeradataスクリプトからPythonへの翻訳リファレンス

特定のトピックに関する詳細情報は、以下のページをご覧ください。

  • BTEQ、基本的なTeradataクエリ構文の翻訳リファレンスを参照してください。

  • FastLoad、 FastLoad 構文の翻訳リファレンスを参照してください。

  • MultiLoad、 MultiLoad 構文の翻訳リファレンスを参照してください。

  • TPT、 TPT 構文については翻訳リファレンスを参照してください。

TPT

TPT ステートメント変換

他のTeradataスクリプト言語と同様に、すべての TPT ステートメントはPythonコードに変換されます。以下はすでにサポートされている変換の例です。

ジョブヘッダー変換の定義

ジョブステートメントは、演算子、スキーマ定義、その内部のステップのようなすべてのステートメントを含むPythonクラスに翻訳されます。

ソースコード

 /* Some comments on the job  */
DEFINE JOB LOADJOB
DESCRIPTION 'LOAD AC_SCHEMA TABLE FROM A FILE'
JobBody
Copy

翻訳済みコード

 ## Some comments on the job
class LOADJOB:
    # DESCRIPTION 'LOAD AC_SCHEMA TABLE FROM A FILE'
    JobBody
Copy

スキーマ変換の定義

スキーマステートメントは、ジョブステートメント用に作成されたクラスの属性に翻訳されます。

ソースコード

 DEFINE SCHEMA DCS_SCHEMA
DESCRIPTION 'DCS DATA'
(
PNRHEADER_ID   PERIOD(DATE),
PNRLOCPERIOD   PERIOD(TIMESTAMP(0)),
CRTDATE        CLOB,
REQTYP         JSON(100000),
seqno          INTEGER,
resdata        INTEGER
);
Copy

翻訳済みコード

 class JOBNAME:
    DCS_SCHEMA = """(
    PNRHEADER_ID VARCHAR(24),
    PNRLOCPERIOD VARCHAR(58),
    CRTDATE VARCHAR /*** MSC-WARNING - SSC-FDM-TD0002 - COLUMN CONVERTED FROM CLOB DATA TYPE ***/,
    REQTYP VARIANT,
    seqno INTEGER,
    resdata INTEGER,
    );"""
Copy

演算子変換の定義

演算子は、ジョブ用に生成されたクラス内でPython関数に翻訳されます。提供されている例は、 SnowConvert が現在サポートしている演算子です

DDL 演算子

DDL 演算子のソースコード

 DEFINE OPERATOR DDL_OPERATOR()
DESCRIPTION 'TERADATA PARALLEL TRANSPORTER DDL OPERATOR'
TYPE DDL
ATTRIBUTES
(
  VARCHAR PrivateLogName ,
  VARCHAR TdpId          = @MyTdpId,
  VARCHAR UserName       = @MyUserName,
  VARCHAR UserPassword   = 'SomePassWord',
  VARCHAR AccountID,
  VARCHAR ErrorList      = ['3807','2580']
);
Copy

翻訳済みコード

 class JobName:
    def DDL_OPERATOR(self):
        #'TERADATA PARALLEL TRANSPORTER DDL OPERATOR'
        global args
        self.con = log_on(user = args.MyUserName, password = 'SomePassWord')
Copy
UPDATE 演算子

UPDATE 演算子のソースコード

 DEFINE OPERATOR LOAD_OPERATOR()
DESCRIPTION 'TERADATA PARALLEL TRANSPORTER LOAD OPERATOR'
TYPE UPDATE
SCHEMA AC_MASTER_SCHEMA
ATTRIBUTES
(
    VARCHAR PrivateLogName ,
    INTEGER MaxSessions       =  32,
    INTEGER MinSessions       =  1,
    VARCHAR TargetTable       = '&TARGET_TABLE',
    VARCHAR TdpId             = @MyTdpId,
    VARCHAR UserName          = @MyUserName,
    VARCHAR UserPassword      = @MyPassword,
    VARCHAR AccountId,
    VARCHAR ErrorTable1       = '&LOG_DB_NAME.ERR1',
    VARCHAR ErrorTable2       = '&LOG_DB_NAME.ERR2',
    VARCHAR LogTable          = '&LOG_DB_NAME.LOG_TABLE'
);
Copy

翻訳済みコード

 class JobName:
    def LOAD_OPERATOR(self, query):
        #'TERADATA PARALLEL TRANSPORTER LOAD OPERATOR'
        #USES SCHEMA AC_MASTER_SCHEMA
        operator_name = "LOAD_OPERATOR"
        return query
Copy
DATA CONNECTOR PRODUCER 演算子

Data Connector Producer演算子のソースコード

 DEFINE OPERATOR FILE_READER()
DESCRIPTION 'TERADATA PARALLEL TRANSPORTER DATA CONNECTOR OPERATOR'
TYPE DATACONNECTOR PRODUCER
SCHEMA AC_MASTER_SCHEMA
ATTRIBUTES
(
  VARCHAR PrivateLogName ,
  VARCHAR DirectoryPath   = '&INPUTFILEPATH' ,
  VARCHAR FileName        = '&INPUTTEXTFILE' ,
  VARCHAR Format          = 'delimited',
  VARCHAR OpenMode        = 'Read',
  VARCHAR TextDelimiter     = '~',
  VARCHAR IndicatorMode   = 'N'
);
Copy

翻訳済みコード

 class JobName:
    def FILE_READER(self):
        #'TERADATA PARALLEL TRANSPORTER DATA CONNECTOR OPERATOR'
        #USES SCHEMA AC_MASTER_SCHEMA
        operator_name = "FILE_READER"
        stage_name = f"{self.jobname}_{operator_name}"
        format_name = f"{self.jobname}_{operator_name}_FILEFORMAT"
        exec(f"""CREATE OR REPLACE FILE FORMAT {format_name} TYPE = 'CSV' FIELD_DELIMITER = '~' TRIM_SPACE = TRUE SKIP_HEADER = 0""")
        exec(f"""CREATE STAGE IF NOT EXISTS {self.jobname}_STAGE""")
        exec(f"""PUT file://{INPUTFILEPATH}/{INPUTTEXTFILE} @{stage_name} OVERWRITE = TRUE AUTO_COMPRESS = FALSE;""")
        temp_table_name = f"{self.jobname}_{operator_name}_TEMP"
        exec(f"""DROP TABLE IF EXISTS {temp_table_name}""")
        exec(f"""CREATE TEMPORARY TABLE {temp_table_name} {self.AC_MASTER_SCHEMA}""")
        exec(f"""COPY INTO {temp_table_name} FROM @{stage_name} FILE_FORMAT = (format_name = '{format_name}')""")
        return temp_table_name
Copy

ステップ変換の定義

ステップもジョブ用に生成されたクラス内のPython関数に翻訳され、翻訳されたコードのメイン関数で呼び出されます。

ステップのソースコード

 STEP setup_tables
(
  APPLY
  ('DELETE FROM  &STAGE_DB_NAME.EMS_AC_MASTER_STG;')
   TO OPERATOR (DDL_OPERATOR() );
);

STEP stLOAD_FILE_NAME
(
  APPLY
  ('INSERT INTO CRASHDUMPS.EMP_NAME
  (EMP_NAME, EMP_YEARS, EMP_TEAM)
  VALUES
  (:EMP_NAME, :EMP_YEARS, :EMP_TEAM);')
  TO OPERATOR (ol_EMP_NAME() [1])
  SELECT * FROM OPERATOR(op_EMP_NAME);
);
Copy

翻訳済みコード

 def setup_tables(self):
    self.DDL_OPERATOR()
    exec(f"""DELETE FROM DATABASE1.{STAGE_DB_NAME}.EMS_AC_MASTER_STG""")

def stLOAD_FILE_NAME(self):
    exec(f"""INSERT INTO DATABASE1.CRASHDUMPS.EMP_NAME (EMP_NAME, EMP_YEARS, EMP_TEAM)
SELECT EMP_NAME, EMP_YEARS, EMP_TEAM
FROM (
{self.ol_EMP_NAME('SELECT * FROM ' + self.op_EMP_NAME() )})""")
Copy

メイン関数

メイン関数はどのスクリプト言語でも常に生成されますが、 TPT の場合、メイン関数にはジョブクラスのインスタンスとジョブ内のステップの呼び出しが含まれます

メイン関数サンプルコード

 def main():
  _LOADJOB = LOADJOB()
  _LOADJOB.setup_tables()
  _LOADJOB.stLOAD_FILE_NAME()
  snowconvert.helpers.quit_application()
Copy

MLOAD

Teradata MultiLoad は、Teradataデータベースの複数のテーブルとビューを高速かつ大量にメンテナンスするためのコマンド駆動型ユーティリティです。

SnowflakeでTeradataの MultiLoad 機能をシミュレートするために、 BTEQ および FastLoad スクリプトの変換と同様に、 MultiLoad ファイルとコマンドをPythonコードに変換します。生成されたコードでは、snowconvert.helpersというSnowflake Pythonプロジェクトを使用しています。このプロジェクトには、Snowflakeの MultiLoad ステートメントをシミュレートするために必要な関数が含まれています。

MultiLoad コマンド翻訳

MultiLoad コマンド のほとんどはSnowflakeでは関係ないと考えられているため、これらのコマンドはコメントアウトされています。以下は、MultiLoad コマンドの概要リストとSnowflakeへの変換ステータスです。

CommandsTransformation StatusNote
ACCEPTCommented
BEGIN MLOADTransformed​​The node is commented out since the transformation occurs in other related statements instead.
BEGIN DELETE MLOADCommented
DATEFORMCommented
DELETEPartially transformedCheck known issues.​
DISPLAYCommented
DML LABELTransformed
END MLOADTransformed​​Commented out since is not necessary for the transformation of the BEGIN MLOAD.
EOCCommented
FIELDTransformed
FILLERTransformedThis command needs to be with a FIELD and LAYOUT command to be converted.
IF, ELSE, and ENDIFCommented
IMPORTTransformed
INSERTTransformedThis is taken as a Teradata Statement, so it doesn't appear in this chapter.
LAYOUTTransformedThis command needs to be with a FIELD and FILLER command to be converted.
LOGDATACommented
LOGMECHCommented
LOGOFFCommented
LOGONCommented
LOGTABLECommented
PAUSE ACQUISITIONCommented
RELEASE MLOADCommented
ROUTE MESSAGESCommented
RUN FILECommented
SETCommented
SYSTEMCommented
TABLECommented
UPDATETransformedThis is taken as a Teradata Statement, so it doesn't appear in this chapter.
VERSIONCommented

しかし、いくつかの例外的なコマンドは、Snowflakeで意図したとおりに動作させるためにPython固有のコードに変換する必要があります。この セクションをご覧ください。

このドキュメントに関するその他のご質問は、snowconvert-support@snowflake.comまでメールでお問い合わせください。

BEGIN MLOAD

コマンド .BEGIN MLOAD の変換は、その動作を正しくシミュレートするために、 .LAYOUT.FIELD.FILLER.DML LABEL、および .IMPORT コマンドを必要とするマルチパートの変換です。

この変換については、以下のサブセクションで詳しく説明します。

.LAYOUT、.FIELD および.FILLER

.LAYOUT.FIELD.FILLER のコマンドの変換は、このレイアウトの IMPORT の将来の関数呼び出しで使用される変数定義を作成します。

Teradata(MultiLoad)

 .LAYOUT INFILE_LAYOUT;
.FIELD TABLE_ID        * INTEGER;
.FIELD TABLE_DESCR     * CHAR(8);
.FILLER COL1           * CHAR(1);
.FIELD TABLE_NBR       * SMALLINT;
.FIELD TABLE_SOMEFIELD * SMALLINT;
Copy

Snowflake(Python)

 #*** Generated code is based on the SnowConvert Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  INFILE_LAYOUT_TableName = "INFILE_LAYOUT_TEMP_TABLE"
  INFILE_LAYOUT_Columns = """TABLE_ID INTEGER, 
TABLE_DESCR CHAR(8), 
COL1 CHAR(1), 
TABLE_NBR SMALLINT, 
TABLE_SOMEFIELD SMALLINT"""
  INFILE_LAYOUT_Conditions = """TABLE_ID AS TABLE_ID, TABLE_DESCR AS TABLE_DESCR, COL1 AS COL1, TABLE_NBR AS TABLE_NBR, TABLE_SOMEFIELD AS TABLE_SOMEFIELD"""
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy

.DML LABEL

.DML LABEL コマンドの変換は、ラベル定義の後にステートメントを含む関数を作成します。.DML LABEL コマンドの後には通常、 InsertUpdate、または Delete があることに注意してください。

Teradata(MultiLoad)

 -- Example of .DML LABEL with INSERT:
.DML LABEL INSERT_TABLE;                                                                                    
INSERT INTO mydb.mytable( TABLE_ID,TABLE_DESCR,TABLE_NBR ) VALUES( :TABLE_ID,:TABLE_DESCR,:TABLE_NBR );

-- Example of .DML LABEL with DELETE:
.DML LABEL DELETE_TABLE;              
DELETE FROM Employee WHERE EmpNo  = :EmpNo;

-- Example of .DML LABEL with an UPDATE, followed by an INSERT:
.DML LABEL UPSERT_TABLE DO INSERT FOR MISSING UPDATE ROWS;
UPDATE   mydb.mytable SET TABLE_ID = :TABLE_ID WHERE TABLE_DESCR = :somedescription
INSERT INTO mydb.mytable(TABLE_ID, TABLE_DESCR, TABLE_NBR) VALUES(:TABLE_ID, :TABLE_DESCR, :TABLE_NBR );
Copy

Snowflake(Python)

 #*** Generated code is based on the SnowConvert Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  def INSERT_TABLE(tempTableName, queryConditions = ""):
    exec(f"""INSERT INTO mydb.mytable (TABLE_ID, TABLE_DESCR, TABLE_NBR)
SELECT
   :TABLE_ID,
   :TABLE_DESCR,
   :TABLE_NBR
FROM {tempTableName} SRC {queryConditions}""")
  exec("""
    DELETE FROM
      Employee
    WHERE
      EmpNo = :EmpNo
    """)
  def UPSERT_TABLE(tempTableName, queryConditions = ""):
    exec(f"""MERGE INTO mydb.mytable TGT USING (SELECT * FROM {tempTableName} {queryConditions}) SRC ON TABLE_DESCR = :somedescription
WHEN MATCHED THEN UPDATE SET
   TABLE_ID = :TABLE_ID
WHEN NOT MATCHED THEN INSERT (TABLE_ID, TABLE_DESCR, TABLE_NBR)
VALUES (:TABLE_ID, :TABLE_DESCR, :TABLE_NBR)""")
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy

.IMPORT

.IMPORT コマンドの変換により、import_file_to_temptable ヘルパーの呼び出しが作成され、ファイルから仮テーブルにデータの読み込みが行われます。その後、元のインポートで使用されたすべての APPLY ラベルへの呼び出しが作成されます。最後に、INSERT ラベルの呼び出しは、クエリパラメーターに変換され、オプションでクエリ条件を持つことができます。

Teradata(MultiLoad)

 .IMPORT INFILE INFILE_FILENAME
    LAYOUT INFILE_LAYOUT
    APPLY INSERT_TABLE
    APPLY UPSERT_TABLE
    Apply DELETE_TABLE;
Copy

Snowflake(Python)

 #*** Generated code is based on the SnowConvert Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. TRANSLATED BELOW **
  #.IMPORT INFILE INFILE_FILENAME LAYOUT INFILE_LAYOUT APPLY INSERT_TABLE APPLY UPSERT_TABLE Apply DELETE_TABLE
   
  snowconvert.helpers.import_file_to_temptable(fr"INFILE_FILENAME", INFILE_LAYOUT_TableName, INFILE_LAYOUT_Columns, INFILE_LAYOUT_Conditions, ',')
  INSERT_TABLE(INFILE_LAYOUT_TableName)
  UPSERT_TABLE(INFILE_LAYOUT_TableName)
  DELETE_TABLE(INFILE_LAYOUT_TableName)
  exec(f"""DROP TABLE {INFILE_LAYOUT_TableName}""")
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy

大容量の例

上に示した様々なコマンドの変換を踏まえて、次の例を考えてみましょう。

この入力データで:

 id,name,age
1,John,25
2,Maria,29
3,Carlos,31
4,Mike,40
5,Laura,27
Copy

Teradata(MultiLoad)

 .begin import mload
        tables
	mySampleTable1
sessions 20
ampcheck none;

.layout myLayOut;
 .field ID * VARCHAR(2) NULLIF ID = '1';
 .field NAME * VARCHAR(25);
 .field AGE * VARCHAR(10);
.dml label insert_data;

INSERT INTO mySampleTable1
 ( 
    ID,
    NAME,
    AGE	
 )
VALUES
 (
    :ID,
    SUBSTRING(:NAME FROM 2),
    :AGE
 );

.import infile sampleData.txt
layout myLayOut
apply insert_data

.end mload;
.logoff;
Copy
ROWIDNAMEAGE
1NULLohn25
22aria29
33arlos31
44ike40
55aura27

Snowflake(Python)

 #*** Generated code is based on the SnowConvert Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE.  **
  #.begin import mload tables mySampleTable1 sessions 20 ampcheck none
   
  myLayOut_TableName = "myLayOut_TEMP_TABLE"
  myLayOut_Columns = """ID VARCHAR(2), 
NAME VARCHAR(25), 
AGE VARCHAR(10)"""
  myLayOut_Conditions = """CASE
   WHEN ID = '1'
      THEN NULL
   ELSE ID
END AS ID, NAME AS NAME, AGE AS AGE"""
  def insert_data(tempTableName, queryConditions = ""):
    exec(f"""INSERT INTO mySampleTable1 (ID, NAME, AGE)
SELECT
   SRC.ID,
   SUBSTRING(SRC.NAME, 2),
   SRC.AGE
FROM {tempTableName} SRC {queryConditions}""")
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. TRANSLATED BELOW **
  #.import infile sampleData.txt layout myLayOut apply insert_data
   
  snowconvert.helpers.import_file_to_temptable(fr"sampleData.txt", myLayOut_TableName, myLayOut_Columns, myLayOut_Conditions, ',')
  insert_data(myLayOut_TableName)
  exec(f"""DROP TABLE {myLayOut_TableName}""")

  if con is not None:
    con.close()
    con = None
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy
ROWIDNAMEAGE
1NULLohn25
22aria29
33arlos31
44ike40
55aura27

既知の問題

1.Deleteステートメントは部分的にサポートされています

LAYOUT で定義された列を指している場合、where条件が見つかると正しく変換されないため、DELETE ステートメントは部分的にサポートされています。

以下の例では、 :EmpNoLAYOUT で定義された列を指しています。ただし、変換ではこの点が考慮されないため、コードは存在しない列を参照することになります。

  exec("""
    DELETE FROM
      Employee
    WHERE
      EmpNo = :EmpNo
    """)

Copy

このドキュメントに関するその他のご質問は、snowconvert-support@snowflake.comまでメールでお問い合わせください。

SnowConvert スクリプトヘルパー

SnowConvert for Teradataは、任意のTeradata SQL またはスクリプト(BTEQ、 FastLoad、 MultiLoad、および TPump)を取り込み、機能的に同等のSnowflake SQL、Snowflake SQL に埋め込まれた JavaScript、およびPythonに変換できます。SnowConvert から出力されるPythonコードは、これらのヘルパークラスの関数を呼び出して変換を完了し、Snowflakeで関数的に同等の出力を作成します。

Snowflake Connector for Python も、Snowflakeアカウントに接続し、 SnowConvert で作成した出力Pythonコードを実行するために呼び出されます。

パッケージの最新バージョン情報は こちら をご覧ください。

注釈

Pythonパッケージ snowconvert-helpers はPythonバージョン3.6、3.7、3.8、3.9をサポートしています。

スクリプトの移行

ソース

移行する次の BTEQ コードがあるとします。

 insert into table1 values(1, 2);
insert into table1 values(3, 4);
insert into table1 values(5, 6);
Copy

出力

以下のような出力が得られるはずです。

The `log_on`function parameters ('user', 'password', 'account', 'database', 'warehouse', 'role', 'token') should be defined by the user.
Copy
 #*** Generated code is based on the SnowConvert Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  exec("""
    INSERT INTO table1
    VALUES (1, 2)
    """)
  exec("""
    INSERT INTO table1
    VALUES (3, 4)
    """)
  exec("""
    INSERT INTO table1
    VALUES (5, 6)
    """)
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy

はじめるにあたり

パッケージをインストールするには、Python環境で以下のコマンドを実行してください。Pythonでのパッケージのインストールに慣れていない場合は、以下のPythonパッケージのページ(https://packaging.python.org/tutorials/installing-packages/)を参照してください。

 pip install snowconvert-helpers
Copy

パッケージがインストールされると、Pythonでスクリプトを移行したコードを実行できるようになります。

コードを実行する

移行したコードを実行するには、 コマンドプロンプト または ターミナル を開き、以下のコマンドを実行するだけです。

 python sample_BTEQ.py
Copy

スクリプトにエラーがなければ、コンソールに以下のような出力が表示されます。

 Executing: INSERT INTO PUBLIC.table1 VALUES (1, 2).
Printing Result Set:
number of rows inserted
1

Executing: INSERT INTO PUBLIC.table1 VALUES (3, 4).
Printing Result Set:
number of rows inserted
1

Executing: INSERT INTO PUBLIC.table1 VALUES (5, 6).
Printing Result Set:
number of rows inserted
1

Error Code 0
Script done >>>>>>>>>>>>>>>>>>>>
Error Code 0
Copy

接続パラメーターの受け渡し

データベースの接続に接続パラメーターを渡す方法はいくつかあります。

  • 関数呼び出しのパラメーターとして、Pythonファイル内でsnowconvert.helpers.log_onを呼び出します。

  • Pythonがコマンドラインから実行されるときに、ユーザー、パスワード、アカウント、データベース、ウェアハウス、およびロールの特定の順序を持つ位置パラメーターとして。

  • コマンドラインからPythonが実行され、そのいずれかが--param-VARNAME=VALUE のように渡される場合、順序制限のない名前付きパラメーターとして SNOW_USER、SNOW_PASSWORD、SNOW_ACCOUNT、SNOW_DATABASE、SNOW_WAREHOUSE、SNOW_ROLE、SNOW_QUERYTAG、SNOWAUTHENTICATOR および SNOWTOKEN。

  • Python実行前に、 SNOW_USER、 SNOW_PASSWORD、 SNOW_ACCOUNT、 SNOW_DATABASE、 SNOW_WAREHOUSE、 SNOW_ROLE、 SNOW_QUERYTAG、 SNOWAUTHENTICATOR および SNOWTOKEN という名前の環境変数として。

指定された前の順序が優先順位を決定する方法です。

関数呼び出しのパラメーター

これらは、以下のように関数呼び出しの位置パラメーターとしてセットすることができます。

    .....
   con = snowconvert.helpers.log_on(
     'myuser',
     'mypassword',
     'myaccount',
     'mydatabase',
     'mywarehouse',
     'myrole',
     5,
     'myauthenticator',
     'mytoken')
   .....
Copy

あるいは、以下のように、関数呼び出しの中で、名前付きパラメーターを任意の順番でセットすることもできます。

    .....
   con = snowconvert.helpers.log_on(
     account:'myaccount',
     password:'mypassword',
     user:'myuser',     
     warehouse:'mywarehouse',
     login_timeout:5,
     authenticator:'myauthenticator',
     toke:'mytoken')
   .....
Copy
位置パラメーター

これらはコマンドラインで以下のように特定の順序でセットする必要があります。

 python sample_BTEQ.py myuser mypassword myaccount mydatabase mywarehouse myrole myauthenticator mytokenr
Copy

また、パラメーターの一部だけをセットすることもできますが、次のように常にユーザーパラメーターから始めます。

 python sample_BTEQ.py myuser mypassword myaccount
Copy
名前付きパラメーター

次のように、コマンドラインで任意の順序で名前付きパラメーターをセットできます(1行を使用しますが、読みやすさを考慮して複数行で表示されています)。

python sample_BTEQ.py --param-SNOW_WAREHOUSE=mywarehouse 
  --param-SNOW_ROLE=myrole 
  --param-SNOW_PASSWORD=mypassword 
  --param-SNOW_USER=myuser 
  --param-SNOW_QUERYTAG=mytag 
  --param-SNOW_ACCOUNT=myaccount
  --param-SNOW_DATABASE=mydatabase 
  --param-SNOW_AUTHENTICATOR=myauthenticator
  --param-SNOW_TOKEN=mytoken
  --param-PRIVATE_KEY_PATH=myprivatekey
  --param-PRIVATE_KEY_PASSWORD=myprivatekeypassword

Copy
環境変数

Pythonスクリプトを呼び出す前に、以下の環境変数がセットできます。

  • SNOW_USER

  • SNOW_PASSWORD

  • SNOW_ACCOUNT

  • SNOW_DATABASE

  • SNOW_WAREHOUSE

  • SNOW_ROLE

  • SNOW_QUERYTAG

  • SNOW_AUTHENTICATOR

  • SNOW_TOKEN

  • PRIVATE_KEY_PATH

  • PRIVATE_KEY_PASSWORD

キーペア認証

log_on 関数は、キーペア認証プロセスもサポートします。キーの作成に関する詳細情報については、以下の Snowflakeドキュメント を参照してください。必要なパラメーターにご注意ください。

log_on(

user='YOUR_USER',

account='YOUR_ACCOUNT',

role = 'YOUR_ROLE',

warehouse = 'YOUR_WAREHOUSE',

database = 'YOUR_DATABASE',

private_key_path='/YOUR_PATH/rsa_key.p8',

private_key_password='YOUR_PASSWORD')

環境変数の受け渡し例

以下は SNOW_AUTHENTICATOR、 SNOW_USER および SNOW_PASSWORD の使用例です。これらは出力Pythonファイルを実行する前に定義され、その後Pythonで生成されたファイルを実行する必要があります。

 SET SNOW_AUTHENTICATOR=VALUE
SET SNOW_USER=myuser
SET SNOW_PASSWORD=mypassword
python sample_BTEQ.py
Copy
 export SNOW_AUTHENTICATOR=VALUE
export SNOW_USER=myuser
export SNOW_PASSWORD=mypassword
python3 sample_BTEQ.py
Copy

ログの有効化

ログを有効にするには、 SNOW_LOGGING という環境変数をtrueにセットします。

それから、ログの構成をカスタマイズしたい場合、 snowconvert.helpers.configure_log() メソッドにパラメーターを次のように渡すことができます。

 snowconvert.helpers.configure_log("SOMEPATH.conf")
Copy

構成ファイルには次の構造が含まれている必要があります。Pythonログに関する情報は、 こちらをクリックしてください

 [loggers]
keys=root

[handlers]
keys=consoleHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler

[logger_simpleExample]
level=DEBUG
handlers=consoleHandler
qualname=simpleExample
propagate=0

[handler_consoleHandler]
class=FileHandler
level=DEBUG
formatter=simpleFormatter
args=('python2.log', 'w')

[formatter_simpleFormatter]
format=%(asctime)s -%(levelname)s - %(message)s
Copy

Snowflake

移行したコードが実行されたら、Snowflakeにアクセスして変更またはデプロイを確認できます。

 select * from PUBLIC.table1;
Copy

上の例で挿入した行が表示されます。

クエリ結果

ローカルヘルパーのドキュメント

まず、pydocというPythonパッケージをインストールする必要があります(snowconvert-helpersのバージョン2.0.2以降で利用可能です)。

 pip install pydoc
Copy

そして、snowconvert-helpersパッケージのPythonドキュメントを表示するために、変換された出力コードとPython出力があるフォルダーに移動する必要があります。

D:\bteq\Output>dir

 Volume in drive D is Storage
 Volume Serial Number is 203C-168C

 Directory of D:\bteq\Output

05/25/2021  03:55 PM    <DIR>          .
05/25/2021  03:55 PM    <DIR>          ..
05/25/2021  03:55 PM               630 input_BTEQ.py
               1 File(s)            630 bytes
               2 Dir(s)  1,510,686,502,912 bytes free

Copy

このディレクトリにある以下を実行する必要があります。

 python -m pydoc -b
Copy

コンソールはお好みのブラウザーを開き、インストールされた全パッケージのドキュメントを HTML ヘルプで表示します。

D:\bteq\Output>python -m pydoc -b
Server ready at http://localhost:61355/
Server commands: [b]rowser, [q]uit
server>

Copy

こうするとブラウザーが開き、次のようなコードのドキュメントが表示されます。

生成されたローカルドキュメントのホームページ

ページの最後までスクロールすると、インストールされているパッケージが表示されます。そして、次のようなものが表示されます。

インストール済みローカルパッケージドキュメントインデックス

SnowConvert (パッケージ)をクリックすると、次のようなものが表示されます。

snowconvert-helpersドキュメント用ホームページ

モジュールヘルパーをクリックすると、以下のような画面が表示されます。

ヘルパーモジュールのホームページ

そして、モジュールの関数とクラスをスクロールすることができます。

関数ドキュメント

既知の問題

問題は見つかりませんでした。

関連 EWIs

関連 EWIs はありません。

技術ドキュメント

関数

プロジェクトで定義されたすべての関数。

access

**`access`**`(path, mode, *, dir_fd=None, effective_ids=False, follow_symlinks=True)`
Copy
説明:

パスへのアクセスをテストするには、実際のuid/gidを使用してください。

dir_fd、effective_ids、follow_symlinksは、プラットフォームで実装されていない可能性があります。それらが利用できない場合、それらを使用すると、 NotImplementedError. が発生します。

ほとんどの操作は、有効なuid/gidを使用するため、このルーチンはsuid/sgid環境で使用し、起動したユーザーがパスへの指定されたアクセスを持っているかどうかをテストできることに注意してください。

パラメーター:
  • パス、 テストされるパス。文字列、バイト、またはパスに似た オブジェクト を使用できます

  • モード、 オペレーティングシステムモードビットフィールド。存在をテストするためにF_OK を使用できます。または、R_OK、W_OK、およびX_OK の包含 OR を使用できます

  • dir_fd、 Noneでない場合は、ディレクトリに開かれたファイル記述子で、パスは相対パスでなければなりません。その場合、パスはそのディレクトリに対して相対的になります

  • effective_ids、 Trueの場合、アクセスは実際のuid/gidの代わりに有効なuid/gidを使用します

  • follow_symlinks、 Falseで、パスの最後の要素がシンボリックリンクの場合、アクセスはリンク先のファイルではなく、シンボリックリンク自体を調べます

at_exit_helpers

**`at_exit_helpers`**`()`
Copy
説明:

スクリプトの実行終了時に実行します。

colored

**`colored`**`(text, color='blue')`
Copy
説明:

指定された色からカラーテキストを印刷します。

パラメーター:
  • テキスト 印刷されるテキスト

  • color="blue" 印刷する色

configure_log

**`configure_log`**`(configuration_path)`
Copy
説明:

Snowflake接続上のデータ関連の実行に対して実行されるログを構成します。ログファイルの名前はデフォルトで「snowflake_python_connector.log」です。

パラメーター:

  • configuration_path ログに必要なすべての設定を含むファイルの構成パス

drop_transient_table

**`drop_transient_table`**`(tempTableName, con=None)`
Copy
説明:

指定された名前の一時テーブルを削除します。

パラメーター:

  • tempTableName 仮テーブル名

  • con=None 使用する接続。Noneを渡すと、最後に実行された接続が使用されます

exception_hook

**`exception_hook`**`(exctype, value, tback)`
Copy
説明:

パラメーター:

  • exctype

  • tback

exec

**`exec`**`(sql_string, using=None, con=None)`
Copy
説明:

最後の接続を使用してSQL文字列を実行します。オプションで引数または特定の接続を使用します。例:

  • _ exec("SELECT * FROM USER")_

  • _ exec("SELECT * FROM USER", con)_

  • _ exec("SELECT * FROM CUSTOMER WHERE CUSTOMERID= %S", customer)_

パラメーター:

  • sql_string SQLの定義

  • using=None 渡されたSQLで使用できるオプションパラメーター

  • con=None 使用する接続。Noneを渡すと、最後に実行された接続が使用されます

exec_file

**`exec_file`**`(filename, con=None)`
Copy
説明:

ファイルの内容を読み込み、指定された接続に含まれるSQLステートメントを実行します。

パラメーター:

  • filename 読み込んで実行するファイル名

  • con=None 使用する接続。Noneを渡すと、最後に実行された接続が使用されます

exec_os

**`exec_os`**`(command)`
Copy
説明:

演算システムでコマンドを実行します。

exec_sql_statement

**`exec_sql_statement`**`(sql_string, con, using=None)`
Copy
説明:

渡された接続で、オプションの引数でSQLステートメントを実行します。

パラメーター:

  • sql_string 実行する文字列を含むSQL

  • con 使用する接続

  • using SQL実行時に使用するオプションパラメーター

expands\using_params**

**`expands_using_params`**`(statement, params)`
Copy
説明:

パラメーターと一緒に渡されたステートメントを展開します。

パラメーター:

  • statement 実行する文字列を含むSQL

  • params SQLステートメントのパラメーター

expandvar

**`expandvar`**`(str)`
Copy
説明:

渡された文字列から変数を展開します。

パラメーター:

  • str 変数で展開される文字列

expandvars

**`expandvars`**`(path, params, skip_escaped=False)`
Copy
説明:

$varおよび${var} 形式の環境変数を展開します。パラメータ「skip_escaped」がTrueの場合、エスケープされた変数参照(つまり、先頭にバックスラッシュが付くもの)はすべてスキップされます。不明な変数は「デフォルト」にセットされます。「デフォルト」がNoneの場合、それらは変更されません。

パラメーター:

  • パス

  • params

  • skip_escaped=False

FAST LOAD

**`fast_load`**`(target_schema, filepath, stagename, target_table_name, con=None)`
Copy
説明:

渡されたパラメーターtarget_schema、filepath、stagename、およびtarget_table_nameで高速ロードを実行します。

パラメーター:

  • target_schema 高速ロードで使用するスキーマの名前

  • filepath テーブルにロードされるファイル名のパス

  • target_table_name データがロードされるテーブル名

  • con=None 使用する接続。Noneを渡すと、最後に実行された接続が使用されます

file\exists_and_readable**

**`file_exists_and_readable`**`(filename)`
Copy
説明:

パラメーター:

  • filename

get\argkey**

**`get_argkey`**`(astr)`
Copy
説明:

渡された文字列から引数のキー値を取得します。文字列「--param-」で始まる必要があります

パラメーター:

  • astr 使用する引数文字列。文字列は--param-column=32のような値でなければならず、返される文字列は「32」になります

get\error_position**

**`get_error_position`**`()`
Copy
説明:

生成されたエラーのスタックの情報を使用して、ファイルからエラー位置を取得します。

get\from_vars_or_args_or_environment**

**`get_from_vars_or_args_or_environment`**`(arg_pos, variable_name, vars, args)`
Copy
説明:

指定された位置から引数を取得するか、テーブル変数から値を取得するか、渡された環境変数名を取得します。

パラメーター:

  • arg_pos 引数パラメーターから使用する引数の位置

  • variable_name 取得する変数名

  • vars 変数名と値のハッシュ

  • args 引数配列パラメーター

import\data_to_temptable**

**`import_data_to_temptable`**`(tempTableName, inputDataPlaceholder, con)`
Copy
説明:

入力データプレースホルダーを使用して、データを仮テーブルにインポートします。

パラメーター:

  • tempTableName、 仮テーブル名。

  • inputDataPlaceholder、 Snowflakeデータベースのステージである使用される入力プレースホルダー

  • con、 使用する接続

import\file**

**`import_file`**`(filename, separator=' ')`
Copy
説明:

渡されたファイル名を、オプションのセパレーターを付けてインポートします。

パラメーター:

  • filename、 インポートするファイル名のパス

  • separator=' '、 オプションのセパレーター

import\file_to_temptable**

**`import_file_to_temptable`**`(filename, tempTableName, columnDefinition)`
Copy
説明:

仮テーブルに渡されたファイルをインポートします。プレフィックスStage_を持つ仮テーブルという名前のパブリックステージが使用されます。仮テーブルへのロードが終了すると、そのプロセスで使用されたステージが削除されます。

パラメーター:

  • filename、 読み込むファイル名

  • tempTableName、 仮テーブル名

  • columnDefinition、 仮テーブルを持つすべてのフィールドの定義

import\reset**

**`import_reset`**`()`
Copy
説明:

log

**`log`**`(*msg, level=20, writter=None)`
Copy
説明:

ログが有効になっているかどうかに応じて、コンソール(標準出力)またはログファイルにメッセージを出力します

パラメーター:

  • *msg、 出力またはログするメッセージ

  • level=20、

  • writter=None、

log\on**

**`log_on`**`(user=None, password=None, account=None, database=None, warehouse=None, role=None, login_timeout=10, authenticator=None)`
Copy
説明:

認証情報、データベース、ウェアハウス、ロール、login_timeout、認証コードをパラメーターとしてSnowflakeデータベースにログインします。

パラメーター:

  • user、 データベースのユーザー

  • password データベースのユーザーのパスワード

  • database、 接続するデータベース

  • warehouse、 接続するデータベースのウェアハウス

  • role、 接続するロール

  • login_timeout、 接続に時間がかかりすぎる場合にエラーを出すまでの最大タイムアウト

  • authenticator、 SNOWFLAKE、 EXTERNALBROWSER、 SNOWFLAKE_JWT または OAUTH のように使用する認証コードがサポートする値

  • token、 OAUTH または JWT トークン

os

**`os`**`(args)`
Copy
説明:

パラメーター:

  • args、

quit\application**

**`quit_application`**`(code=None)`
Copy
説明:

アプリケーションを終了し、オプションで渡されたコードを返します。

パラメーター:

  • code=None、 終了後に返されるコード

read\params_args**

**`read_param_args`**`(args)`
Copy
説明:

渡された配列からパラメーターの引数を読み込みます。

パラメーター:

  • args、 使用する引数

readrun

**readrun**(line, skip=0)
Copy
説明:

与えられたファイル名の行を読み、オプションでファイルの先頭のいくつかの行をスキップします。

パラメーター:

  • line、 読み込むファイル名

  • skip=0、 スキップする行

remark

**remark**(arg)
Copy
説明:

引数を印刷します。

パラメーター:

  • arg、 印刷する引数

repeat\previous_sql_statement**

**`repeat_previous_sql_statement`**`(con=None, n=1)`
Copy
説明:

前に実行されたSQLステートメントを繰り返します。

パラメーター:

  • con=None、 指定されている場合は接続。これが渡されない場合は、最後に行われた接続が使用されます

  • n=1、 再実行する前のステートメントの数

set\default_error_level**

**`set_default_error_level`**`(severity_value)`
Copy
説明:

パラメーター:

  • severity_value、

set\error_level**

**`set_error_level`**`(arg, severity_value)`
Copy
説明:

パラメーター:

  • arg、

  • severity_value、

simple\fast_load**

**`simple_fast_load`**`(con, target_schema, filepath, stagename, target_table_name)`
Copy
説明:

接続と渡されたパラメーターtarget_schema、filepath、stagename、ターゲットテーブル名で単純な高速ロードを実行します。

パラメーター:

  • arg、 使用する接続

  • target_schema、 高速ロードで使用するスキーマの名前

  • filepath、 テーブルにロードされるファイル名のパス

  • target_table_name、 データがロードされるテーブル名

stat

**`stat`**`(path, *, dir_fd=None, follow_symlinks=True)`
Copy
説明:

_与えられたパスでstatシステム呼び出しを実行します。_dir_fdとfollow_symlinksは、お使いのプラットフォームで実装されていない可能性があります。それらが利用できない場合、それらを使用すると、 NotImplementedError が発生します。開いているファイル記述子としてパスを指定するときに、dir_fdまたはfollow_symlinksを使用するとエラーになります

パラメーター:

  • path、 検査するパス。文字列、バイト、パスのような オブジェクト、または\ open-file-descriptor intを使用できます

  • dir_fd、 Noneでない場合は、ディレクトリに開かれたファイル記述子で、パスは相対文字列でなければなりません。その場合、パスはそのディレクトリに対して相対的になります

  • follow_symlinks、 Falseで、パスの最後の要素がシンボリックリンクの場合、statはリンク先のファイルではなく、シンボリックリンク自体を調べます

system

**`system`**`(command)`
Copy
説明:

サブシェルでコマンドを実行します。

パラメーター:

  • _ コマンド_

using

**`using`**`(*argv)`
Copy
説明:

パラメーター:

  • _ *argv_

クラス

プロジェクトで定義されたすべてのクラス

BeginLoading クラス

このクラスは import_file_to_tab 静的関数を含んでおり、 BEGIN LOADING と FastLoad の関連コマンドのサポートを提供します。

import_file_to_tab()

パラメーター:

  1. target_schema_table

    • ターゲットスキーマ(オプション)とテーブル名

  2. define_file

    • 読み込むファイル名

  3. define_columns

    • 仮テーブルのすべての列の定義

  4. begin_loading_columns

    • 挿入する列名。値の挿入順序を指定します

  5. begin_loading_values

    • 変換する生の挿入値のリスト

  6. field_delimiter

    • フィールド区切り文字

  7. (オプション) skip_header

    • スキップする行数

  8. (オプション) input_data_place_holder

    • サポートされているクラウドプロバイダー内のファイルの場所。ファイルがローカルに保存されていない場合のパラメーターセット

  9. (オプション) con

    • 使用する接続

エクスポートクラス

クラスの静的メソッド

  • defaults()

  • null(value=None)

  • record_mode(value=None)

  • report(file, separator=' ')

  • reset()

  • separator_string(value=None)

  • separator_width(value=None)

  • side_titles(value=None)

  • title_dashes(value=None, withValue=None)

  • title_dashes_with(value=None)

  • width(value=None)

\ ここで定義されたデータとその他の属性

  • expandedfilename = None

  • separator = '' \

インポートクラス

クラスのメソッド

  • reset()

クラスの静的メソッド

  • file(file, separator=' ')

  • using(globals, *argv)

クラスで定義されたデータとその他の属性

  • expandedfilename = None

  • no_more_rows = False

  • read_obj = None

  • reader = None

  • separator = ' '

Parameters Class

クラスで定義されたデータとその他の属性

  • passed_variables = {}

BTEQ

Basic Teradata Query(BTEQ)は、ワークステーションのユーザーが1つまたは複数のTeradataデータベースシステムと通信し、印刷と画面出力の両方でレポートを形式化できるようにする、コマンドベースの汎用プログラムです。

SnowflakeでTeradataの BTEQ 機能をシミュレートするために、 MultiLoad および FastLoad スクリプトの変換と同様に、 BTEQ ファイルとコマンドをPythonコードに変換します。生成されたコードでは、snowconvert.helpersというSnowflake Pythonプロジェクトを使用しています。このプロジェクトには、Snowflakeの BTEQ ステートメントをシミュレートするために必要な関数が含まれています。

BTEQ コマンド翻訳

次のテーブルは、 BTEQ コマンドのSnowflakeへの変換を示します。

Teradata

Snowflake

注意

ERRORCODE != 0

snowconvert.helpers.error_code != 0

.EXPORT DATA FILE=fileName

Export.report("fileName", ",")

関数に機能はありません

.EXPORT INDICDATA FILE=fileName

Export.report("fileName", ",")

関数に機能はありません

.EXPORT REPORT FILE=fileName

Export.report("fileName", ",")

関数に機能はありません

.EXPORT DIF FILE=fileName

Export.report("fileName", ",")

関数に機能はありません

.EXPORT RESET

Export.reset()

関数に機能はありません

.IF ERRORCODE != 0 THEN .QUIT ERRORCODE

If snowconvert.helpers.error_code != 0: snowconvert.helpers.quit_application (snowconvert.helpers.error_code)

.IMPORT RESET

snowconvert.helpers.import_reset()

関数に機能はありません

.LABEL newLabel

def NEWLABEL():
snowconvert.helpers.quit_application()

.LOGOFF

ステートメントはコメントされています

.LOGON

ステートメントはコメントされています

.LOGMECH

ステートメントはコメントされています

.OS /fs/fs01/bin/filename.sh 'load'

snowconvert.helpers.os(""/fs/fs01/bin/filename.sh 'load' "")

.RUN FILE=newFile

for statement in snowconvert.helpers.readrun("newFile"): eval(statement)

.SET DEFAULTS

Export.defaults()

関数に機能はありません

.SET ERRORLEVEL 3807 SEVERITY 0

snowconvert.helpers.set_error_level(3807, 0)

.SET RECORMODE OFF

Export.record_mode(False)

.SET RECORMODE ON

Export.record_mode(True)

.SET SEPARATOR '|'

Export.separator_string('|')

関数に機能はありません

.SET WIDTH 120

Export.width(120)

関数に機能はありません

.Remark ""Hello world!"""

snowconvert.helpers.remark(r""""""Hello world!"""""")

.QUIT ERRORCODE

snowconvert.helpers.quit_application(

snowconvert.helpers.error_code

)

.QUIT

snowconvert.helpers.quit_application()

SQL ステートメント

exec(statement)

$(<$INPUT_SQL_FILE)

exec_file("$INPUT_SQL_FILE")

= (前のコマンドを繰り返す)

snowconvert.helpers.repeat_previous_sql_statement(con)

前のテーブルで示したステートメントのうち、より複雑なものについては、より詳細な例を示したサブセクションで説明しています。

.GOTO 変換

私たちは BTEQ スクリプトをPythonに変換しているので、 BTEQ で有効なある種の構造はPythonでは本質的にサポートされていません。これは、 .Label コマンドを使用する .GOTO コマンドのケースです。

このため、これらのコマンドの機能をエミュレートできるように、 .Label コマンドを、後続のコールステートメントを持つ関数に変換する代替手段が開発されました。

以下のコードを確認してください。

 .LABEL FIRSTLABEL
SELECT * FROM MyTable1;
.LABEL SECONDLABEL
SELECT * FROM MyTable2;
SELECT * FROM MyTable3;
Copy

上の例では5つのコマンドがありました。そのうちの2つは .Label コマンドでした。コマンド FIRSTLABEL は、別の .LABEL コマンドが見つかるまで、その下のステートメントを含む関数に変換されました。別のラベルが呼ばれると(このケースでは SECONDLABEL)、最初の関数が終了し、新しい関数が開始されます。

先ほどの例を移行すると、結果はこうなります。

 #*** Generated code is based on the SnowConvert Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  FIRSTLABEL()
  snowconvert.helpers.quit_application()
def FIRSTLABEL():
  exec("""
    SELECT
      *
    FROM
      MyTable1
    """)
  SECONDLABEL()
def SECONDLABEL():
  exec("""
    SELECT
      *
    FROM
      MyTable2
    """)
  exec("""
    SELECT
      *
    FROM
      MyTable3
    """)

if __name__ == "__main__":
  main()
Copy

関数 _ FIRSTLABEL_ の呼び出しがあることに注目してください。この関数はステートメントが1つしかなく、元のコードでは FIRSTLABEL に続く唯一のラベル以外のコマンドになります。FIRSTLABEL 関数が終了する前に、その関数に続くステートメントで _ SECONDLABEL_ を呼び出します。

注意:

  • コネクタ変数 con = None を作成し、 main() 関数でその変数に入力します: con = snowconvert.helpers.log_on()

  • ログのセットアップ: snowconvert.helpers.configure_log()

クエリステートメントの実行

BTEQ ファイルで見つかった SQL ステートメントはすべて、 snowconvert.helpersが提供する exec 関数によって実行されます。例えば、次のようなコードです。

 CREATE TABLE aTable (aColumn BYTEINT);
Copy

これは次のように変換されます。

 #*** Generated code is based on the SnowConvert Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  exec("""
    CREATE OR REPLACE TABLE aTable (
      aColumn BYTEINT
    )
    """)
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy

スクリプトファイルの実行

ユーザーの BTEQ コマンドとTeradata SQL ステートメントを含むファイルは、スクリプト、実行ファイル、マクロ、またはストアドプロシージャと呼ばれます。例えば、 SAMPFILE というファイルを作成し、以下の BTEQ スクリプトを入力します。

    .LOGON tdpid/userid,password 
   SELECT * FROM department;
   .LOGOFF
Copy

実行ファイルを実行するには、 BTEQ RUN コマンドのいずれかの形式を入力します。

.RUN FILE=sampfile

Copy

2番目のコードを変換すると、結果は次のようになります。

 #*** Generated code is based on the SnowConvert Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()

  for statement in snowconvert.helpers.readrun(fr"sampfile"):
    eval(statement)
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy

snowconvert.helpers.readrun("sampfile") は SAMPFILE から各行を返し、FOR ステートメントでは、各行が eval 関数に渡されます。これは渡された式を解析し、プログラム内でPython式を実行するメソッドです(SAMPFILE は動作するように変換する必要があります)。

SQL ファイルの実行

BTEQ ファイルの実行中に、 SQL ファイルが見つかることがあります。例えば、 NEWSQL という SQL ファイルがあるとします。

 CREATE TABLE aTable (aColumn BYTEINT);
Copy

これはスクリプト中に以下の行で実行できます。

 $(<$NEWSQL)
Copy

そして、スクリプトの変換後の結果は次のとおりです。

 #*** Generated code is based on the SnowConvert Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  exec("""
    CREATE OR REPLACE TABLE aTable (
      aColumn BYTEINT
    )
    """)
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy

exec_file ヘルパー関数は NEWSQL ファイルから各行を読み込み、セクション クエリステートメントの実行で説明されているようにexec関数を使用します。

既知の問題

問題は見つかりませんでした。

関連 EWIs

問題は見つかりませんでした。

REPEAT

注釈

わかりやすくするため、出力コードの一部を省略しています。

Teradataの ドキュメント によると、 REPEAT ステートメントにより、ユーザーは次の SQL リクエストの最大提出回数を指定できます。SQL リクエストは単一または複数ステートメントのリクエストになる可能性があることに注意してください。これは、 REPEAT ステートメントに続く各ステートメントのセミコロンの位置によって定義されます。

構文

REPEAT [ n [ PACK p [ REQBUFLEN b ] ] | * | RECS r]
<sql_request>

Copy

サンプルソースパターン

この入力データで:

A B C
D E F
G H I

Copy
* [
] *

Copy

Teradata:

 .IMPORT DATA FILE = inputData.dat;
.REPEAT *
USING var_1 (CHARACTER), var_2 (CHARACTER), var_3 (CHARACTER)
INSERT INTO testtabu (c1) VALUES (:var_1)
;INSERT INTO testtabu (c1) VALUES (:var_2) 
;INSERT INTO testtabu (c1) VALUES (:var_3) 
;UPDATE testtabu 
   SET c2 = 'X'
   WHERE c1 = :var_1 
;UPDATE testtabu 
   SET c2 = 'Y' 
   WHERE c1 = :var_2 
;UPDATE testtabu 
   SET c2 = 'Z'
   WHERE c1 = :var_3
;INSERT INTO TESTTABU (c1, c2) VALUES ('?','_');

.REPEAT 10
INSERT INTO TESTTABU2 VALUES ('John Doe', 23);

.REPEAT RECS 5
INSERT INTO TESTTABU2 VALUES ('Bob Alice', 21);

.IMPORT DATA FILE = inputData2.dat;
USING (var_1 CHARACTER, var_2 CHARACTER)
INSERT INTO testtabu (c1) VALUES (:var_1) 
;INSERT INTO testtabu (c1) VALUES (:var_2);
Copy
C1C2
AX
DX
GX
BY
EY
HY
CZ
FZ
IZ
?_
?_
?_
*null
[null
MY_NAMEMY_AGE
John Doe23
John Doe23
John Doe23
John Doe23
John Doe23
John Doe23
John Doe23
John Doe23
John Doe23
John Doe23
Bob Alice21
Bob Alice21
Bob Alice21
Bob Alice21
Bob Alice21

Snowflake:

 #*** Generated code is based on the SnowConvert Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  snowconvert.helpers.import_file(fr"inputData.dat")
  ssc_repeat_value = '*'
  ssc_max_iterations = 1

  for ssc_repeat_position in range(0, ssc_max_iterations):

    if ssc_repeat_position == 0:
      using = snowconvert.helpers.using("var_1", "CHARACTER", "var_2", "CHARACTER", "var_3", "CHARACTER", rows_to_read = ssc_repeat_value)
      exec("""
        INSERT INTO testtabu (c1)
        VALUES (:var_1)
        """, using = using)
      exec("""
        INSERT INTO testtabu (c1)
        VALUES (:var_2)
        """, using = using)
      exec("""
        INSERT INTO testtabu (c1)
        VALUES (:var_3)
        """, using = using)
      exec("""
        UPDATE testtabu
          SET
            c2 = 'X'
          WHERE
            c1 = :var_1
        """, using = using)
      exec("""
        UPDATE testtabu
          SET
            c2 = 'Y'
          WHERE
            c1 = :var_2
        """, using = using)
      exec("""
        UPDATE testtabu
          SET
            c2 = 'Z'
          WHERE
            c1 = :var_3
        """, using = using)
      exec("""
        INSERT INTO TESTTABU (c1, c2)
        VALUES ('?', '_')
        """, using = using)

  ssc_repeat_value = 10
  ssc_max_iterations = 10

  for ssc_repeat_position in range(0, ssc_max_iterations):
    exec("""
      INSERT INTO TESTTABU2
      VALUES ('John Doe', 23)
      """)
  ssc_repeat_value = 5
  ssc_max_iterations = 5

  for ssc_repeat_position in range(0, ssc_max_iterations):
    exec("""
      INSERT INTO TESTTABU2
      VALUES ('Bob Alice', 21)
      """)
  snowconvert.helpers.import_file(fr"inputData2.dat")
  using = snowconvert.helpers.using("var_1", "CHARACTER", "var_2", "CHARACTER", rows_to_read = 1)
  exec("""
    INSERT INTO testtabu (c1)
    VALUES (:var_1)
    """, using = using)
  exec("""
    INSERT INTO testtabu (c1)
    VALUES (:var_2)
    """, using = using)
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy
C1C2
AX
DX
GX
BY
EY
HY
CZ
FZ
IZ
?_
?_
?_
*null
[null
MY_NAMEMY_AGE
John Doe23
John Doe23
John Doe23
John Doe23
John Doe23
John Doe23
John Doe23
John Doe23
John Doe23
John Doe23
Bob Alice21
Bob Alice21
Bob Alice21
Bob Alice21
Bob Alice21

既知の問題

問題は見つかりませんでした。

関連 EWIs

関連 EWIs はありません。

USING REQUEST MODIFIER

Some parts in the output code are omitted for clarity reasons.
Copy

Teradataの ドキュメント にあるように、 USING REQUEST MODIFIER は、その後の SELECTINSERTUPDATE、または DELETE ステートメントで使用される1つ以上の変数パラメーター名を定義し、データをインポートまたはエクスポートします。

このステートメントの構文は以下の通りです。

 USING ( <using_spec> [,...] ) SQL_request

<using_spec> ::= using_variable_name data_type [ data_type_attribute [...] ]
  [ AS { DEFERRED [BY NAME] | LOCATOR } ]
Copy

Teradataのドキュメントに記載されているように、定義されたパラメーターにデータをロードするには、 USING REQUEST MODIFIER の前に.IMPORT ステートメントが必要です。

したがって、このステートメントの変換は以下のステップに従います。

  1. SnowConvert ヘルパーから import_file() 関数を呼び出します。これにより、データが仮ファイルにロードされます。

  2. SnowConvert ヘルパーから using() 関数を呼び出し、ロードされたデータを含む辞書を作成します。

  3. 各クエリについて、 SnowConvert ヘルパーから exec() 関数を実行し、以前に定義した辞書を渡します。これはSnowflake Python Connectorのデータバインド機能を使用します。

この入力データで:

 A,B,C
Copy

Teradata(MultiLoad)

 .IMPORT DATA FILE = inputData.dat;
USING var_1 (CHARACTER), var_2 (CHARACTER), var_3 (CHARACTER)
INSERT INTO testtabu (c1) VALUES (:var_1)
;INSERT INTO testtabu (c1) VALUES (:var_2) 
;INSERT INTO testtabu (c1) VALUES (:var_3) 
;UPDATE testtabu 
   SET c2 = 'X'
   WHERE c1 = :var_1 
;UPDATE testtabu 
   SET c2 = 'Y' 
   WHERE c1 = :var_2 
;UPDATE testtabu 
   SET c2 = 'Z'
   WHERE c1 = :var_3;
Copy
ROWC1C2
1AX
2BY
3CZ

Snowflake(Python)

 #*** Generated code is based on the SnowConvert Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  snowconvert.helpers.import_file(fr"inputData.dat")
  using = snowconvert.helpers.using("var_1", "CHARACTER", "var_2", "CHARACTER", "var_3", "CHARACTER", rows_to_read = 1)
  exec("""
    INSERT INTO testtabu (c1)
    VALUES (:var_1)
    """, using = using)
  exec("""
    INSERT INTO testtabu (c1)
    VALUES (:var_2)
    """, using = using)
  exec("""
    INSERT INTO testtabu (c1)
    VALUES (:var_3)
    """, using = using)
  exec("""
    UPDATE testtabu
      SET
        c2 = 'X'
      WHERE
        c1 = :var_1
    """, using = using)
  exec("""
    UPDATE testtabu
      SET
        c2 = 'Y'
      WHERE
        c1 = :var_2
    """, using = using)
  exec("""
    UPDATE testtabu
      SET
        c2 = 'Z'
      WHERE
        c1 = :var_3
    """, using = using)
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy
ROWC1C2
1AX
2BY
3CZ

既知の問題

1. .REPEAT コマンドはまだサポートされていません

.REPEAT コマンドはまだサポートされていません。つまり、 USING REQUEST MODIFIER は入力ファイルの最初の行からロードされたデータのみを使用します。したがって、クエリは一度しか実行されません。

この問題は、.REPEAT コマンドが適切な変換サポートを受けると修正されるはずです。

このドキュメントに関するその他のご質問は、snowconvert-support@snowflake.comまでメールでお問い合わせください。

関連 EWIs

関連 EWIs はありません。

FLOAD

Teradata FastLoad は、Teradataデータベースの空のテーブルに大量のデータを素早くロードするためのコマンド駆動型ユーティリティです。

SnowflakeでTeradataの FastLoad 機能をシミュレートするために、 BTEQ および MultiLoad スクリプトの変換と同様に、 FastLoad ファイルとコマンドをPythonコードに変換します。生成されたコードでは、snowconvert.helpersというSnowflake Pythonプロジェクトを使用しています。このプロジェクトには、Snowflakeの FastLoad ステートメントをシミュレートするために必要な関数が含まれています。

FastLoad コマンド翻訳

FastLoad コマンド のほとんどはSnowflakeでは関係ないと考えられているため、これらのコマンドはコメントアウトされています。以下は、FastLoad コマンドの概要リストとSnowflakeへの変換ステータスです。

Teradata FastLoad コマンド

変換ステータス

注意

AXSMOD

コメント済み

BEGIN LOADING

変換済み

​関連する INSERT ステートメントで変換が行われるため、このノードはコメントアウトされます。

CLEAR

コメント済み

DATEFORM

コメント済み

DEFINE

変換済み

END LOADING

変換済み

​BEGIN LOADING の変換には必要ないため、コメントアウトされます。

ERRLIMIT

コメント済み

HELP

コメント済み

HELP TABLE

コメント済み

INSERT

変換済み

BEGIN LOADING の一部として変換されます。

LOGDATA

コメント済み

LOGMECH

コメント済み

LOGOFF

コメント済み

LOGON

コメント済み

NOTIFY

コメント済み

OS

コメント済み

QUIT

コメント済み

RECORD

コメント済み

RUN

コメント済み

SESSIONS

コメント済み

SET RECORD

変換済み

SET SESSION CHARSET

コメント済み

SHOW

コメント済み

SHOW VERSIONS

コメント済み

SLEEP

コメント済み

TENACITY

コメント済み

デフォルトの変換

これらのステートメントに対する ConversionTool のデフォルト動作はコメントアウトです。例:

Teradata(FastLoad)

 SESSIONS 4;
ERRLIMIT 25;
Copy

Snowflake(Python)

 #*** Generated code is based on the SnowConvert Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE.  **
  #SESSIONS 4
   
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE.  **
  #ERRLIMIT 25
   
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy

それにもかかわらず、Snowflakeで意図したとおりに動作するためには、特定のPythonステートメントに変換しなければならない例外がいくつかあります。

埋め込み SQL

FastLoad スクリプトは、同じファイル内でTeradataステートメントをサポートします。これらのステートメントの大部分は、いくつかの例外を除いて、 BTEQ ファイル内にあるのと同じように変換されます。

エラーテーブルのドロップは、 FastLoad ファイル内の場合はコメントアウトされます。

Teradata(FastLoad)

 DROP TABLE Error1;
DROP TABLE Error2;
Copy

Snowflake(Python)

 #*** Generated code is based on the SnowConvert Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  exec("""
    DROP TABLE Error1
    """)
  exec("""
    DROP TABLE Error2
    """)
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy

大容量の例

上に示した様々なコマンドの変換を踏まえて、次の例を考えてみましょう。

Teradata(FastLoad)

 SESSIONS 4;
ERRLIMIT 25;
DROP TABLE FastTable;
DROP TABLE Error1;
DROP TABLE Error2;
CREATE TABLE FastTable, NO FALLBACK
   ( ID INTEGER, UFACTOR INTEGER, MISC CHAR(42))
   PRIMARY INDEX(ID);
DEFINE ID (INTEGER), UFACTOR (INTEGER), MISC (CHAR(42))
   FILE=FileName;
SHOW;
BEGIN LOADING FastTable ERRORFILES Error1,Error2
   CHECKPOINT 10000;
INSERT INTO FastTable (ID, UFACTOR, MISC) VALUES
   (:ID, :MISC);
END LOADING;
Copy

Snowflake(Python)

 #*** Generated code is based on the SnowConvert Python Helpers version 2.0.6 ***
#** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "Error1", "Error2" **
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE.  **
  #SESSIONS 4
   
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE.  **
  #ERRLIMIT 25
   
  exec("""
    DROP TABLE FastTable
    """)
  exec("""
    CREATE OR REPLACE TABLE FastTable (
      ID INTEGER,
      UFACTOR INTEGER,
      MISC CHAR(42)
    )
    """)
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. TRANSLATED BELOW AS ASSIGNMENT STATEMENTS **
  #DEFINE ID (INTEGER), UFACTOR (INTEGER), MISC (CHAR(42)) FILE = FileName
   
  ssc_define_columns = "ID (INTEGER), UFACTOR (INTEGER), MISC (CHAR(42))"
  #Set file name manually if empty
  ssc_define_file = f"""FileName"""
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE.  **
  #SHOW
   
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. TRANSLATED BELOW **
  #BEGIN LOADING FastTable ERRORFILES Error1, Error2 CHECKPOINT 10000
   
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. TRANSLATED BELOW AS PART OF THE BEGIN LOADING TRANSLATION **
  #INSERT INTO FastTable (ID, UFACTOR, MISC) VALUES (:ID, :MISC)
   
  ssc_begin_loading_columns = "(ID, UFACTOR, MISC)"
  ssc_begin_loading_values = [":ID", ":MISC"]
  BeginLoading.import_file_to_table(f"""FastTable""", ssc_define_columns, ssc_define_file, ssc_begin_loading_columns, ssc_begin_loading_values, ",")
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. END LOADING **
  #END LOADING
   
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy

このドキュメントに関するその他のご質問は、snowconvert-support@snowflake.comまでメールでお問い合わせください。

既知の問題

問題は見つかりませんでした。

関連 EWIs

  1. SSC-FDM-0007: 依存関係のない要素。

  2. SSC-FDM-0027: 次のステートメントを削除しました。 SnowFlake には適用されません。

BEGIN LOADING

コマンド BEGIN LOADING の変換は、その動作を正しくシミュレートするために、 DEFINEINSERT、(オプションで) SET RECORD コマンドを必要とするマルチパートの変換です。

この変換については、以下のサブセクションで詳しく説明します。

SET RECORD

上記の通り、このコマンドは BEGIN LOADING の変換には必要ありません。見つからない場合、デフォルトの区切り文字は','(コンマ)にセットされます。そうでない場合は、定義された区切り文字が使用されます。この値は ssc_set_record 変数に格納されます。

現在のところ、 SET RECORD VARTEXTSET RECORD FORMATTEDSET RECORD UNFORMATTED のみがサポートされています。BINARY および TEXT キーワード指定の場合、代わりにエラー EWI が置かれます。

Teradata(FastLoad)

 SET RECORD VARTEXT DELIMITER 'c' DISPLAY ERRORS 'efilename';
SET RECORD VARTEXT 'l' 'c' NOSTOP;
SET RECORD VARTEXT 'l' TRIM NONE LEADING 'p';
SET RECORD VARTEXT 'l' TRIM NONE TRAILING 'p';
SET RECORD VARTEXT 'l' TRIM NONE BOTH 'p';
SET RECORD FORMATTED TRIM NONE BOTH;
SET RECORD UNFORMATTED QUOTE NO OPTIONAL;
SET RECORD BINARY QUOTE NO YES 'q';
SET RECORD TEXT QUOTE OPTIONAL;
Copy

Snowflake(Python)

 #*** Generated code is based on the SnowConvert Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. TRANSLATED BELOW AS AN ASSIGNMENT STATEMENT **
  #SET RECORD VARTEXT DELIMITER 'c' DISPLAY ERRORS 'efilename'
   
  ssc_set_record = ""
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. TRANSLATED BELOW AS AN ASSIGNMENT STATEMENT **
  #SET RECORD VARTEXT 'l' 'c' NOSTOP
   
  ssc_set_record = "'l'"
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. TRANSLATED BELOW AS AN ASSIGNMENT STATEMENT **
  #SET RECORD VARTEXT 'l' TRIM NONE LEADING 'p'
   
  ssc_set_record = "'l'"
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. TRANSLATED BELOW AS AN ASSIGNMENT STATEMENT **
  #SET RECORD VARTEXT 'l' TRIM NONE TRAILING 'p'
   
  ssc_set_record = "'l'"
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. TRANSLATED BELOW AS AN ASSIGNMENT STATEMENT **
  #SET RECORD VARTEXT 'l' TRIM NONE BOTH 'p'
   
  ssc_set_record = "'l'"
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. TRANSLATED BELOW AS AN ASSIGNMENT STATEMENT **
  #SET RECORD FORMATTED TRIM NONE BOTH
   
  ssc_set_record = ","
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. TRANSLATED BELOW AS AN ASSIGNMENT STATEMENT **
  #SET RECORD UNFORMATTED QUOTE NO OPTIONAL
   
  ssc_set_record = "UNFORMATTED"
  #** SSC-EWI-0021 - 'BINARY' KEYWORD SPECIFICATION FOR SET RECORD NOT SUPPORTED IN SNOWFLAKE **
  #SET RECORD BINARY QUOTE NO YES 'q'
   
  #** SSC-EWI-0021 - 'TEXT' KEYWORD SPECIFICATION FOR SET RECORD NOT SUPPORTED IN SNOWFLAKE **
  #SET RECORD TEXT QUOTE OPTIONAL
   
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy

DEFINE

DEFINE コマンドの変換では、 ssc_define_columnsssc_define_file 変数にそれぞれ列定義の値と BEGIN LOADING 変換で使用するファイルパスをセットします。

Teradata(FastLoad)

 DEFINE
    id (INTEGER),
    first_name (VARCHAR(50)),
    last_name (VARCHAR(50)),
    salary (FLOAT)
FILE=/tmp/inputData.txt;

DEFINE
    id (INTEGER),
    first_name (VARCHAR(50)),
    last_name (VARCHAR(50)),
    salary (FLOAT)

DEFINE
FILE=/tmp/inputData.txt;

DEFINE;
Copy

Snowflake(Python)

 #*** Generated code is based on the SnowConvert Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. TRANSLATED BELOW AS ASSIGNMENT STATEMENTS **
  #DEFINE id (INTEGER), first_name (VARCHAR(50)), last_name (VARCHAR(50)), salary (FLOAT) FILE = /tmp/inputData.txt
   
  ssc_define_columns = "id (INTEGER), first_name (VARCHAR(50)), last_name (VARCHAR(50)), salary (FLOAT)"
  #Set file name manually if empty
  ssc_define_file = f"""/tmp/inputData.txt"""
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. TRANSLATED BELOW AS ASSIGNMENT STATEMENTS **
  #DEFINE id (INTEGER), first_name (VARCHAR(50)), last_name (VARCHAR(50)), salary (FLOAT)
   
  ssc_define_columns = "id (INTEGER), first_name (VARCHAR(50)), last_name (VARCHAR(50)), salary (FLOAT)"
  #Set file name manually if empty
  ssc_define_file = f""""""
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. TRANSLATED BELOW AS ASSIGNMENT STATEMENTS **
  #DEFINE FILE = /tmp/inputData.txt
   
  ssc_define_columns = ""
  #Set file name manually if empty
  ssc_define_file = f"""/tmp/inputData.txt"""
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. TRANSLATED BELOW AS ASSIGNMENT STATEMENTS **
  #DEFINE
   
  ssc_define_columns = ""
  #Set file name manually if empty
  ssc_define_file = f""""""
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy

BEGIN LOADING

変換に関連する情報は、関連する INSERT ステートメントにあるので、BEGIN LOADING コマンドはコメントアウトされています。

ERRORFILESNODROPCHECKPOINTINDICATORS および DATAENCRYPTION の指定は変換に必要ないため、コメントアウトされています。

Teradata(FastLoad)

 BEGIN LOADING FastTable ERRORFILES Error1,Error2
   CHECKPOINT 10000;
Copy

Snowflake(Python)

 #*** Generated code is based on the SnowConvert Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. TRANSLATED BELOW **
  #BEGIN LOADING FastTable ERRORFILES Error1, Error2 CHECKPOINT 10000
   
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy

INSERT

関連する INSERT ステートメントの変換では、ロードする値を挿入する順序を決定するために使用される ssc_begin_loading_columns および ssc_begin_loading_values 変数の値をセットします。

最後に、これらの変数と上記のセクションで説明した変数を使って、 SnowConvert.Helpers モジュールの BeginLoading.import_file_to_table 関数部分を呼び出します。この関数は、 FastLoad BEGIN LOADING プロセス全体の動作をシミュレートします。この関数の詳細については、こちらをご覧ください。

Teradata(FastLoad)

 SET RECORD VARTEXT """";
DEFINE
    _col1 (CHAR(10)),
    _col2 (CHAR(7)),
    _col3 (CHAR(2, NULLIF = 'V5'))
FILE=inputDataNoDel.txt;
BEGIN LOADING TESTS.EmpLoad4
ERRORFILES ${CPRDBName}.ET_${LOADTABLE},${CPRDBName}.UV_${LOADTABLE}
CHECKPOINT 1000;
INSERT INTO TESTS.EmpLoad4 (col2, col3, col1, col4)	
VALUES
(
    :_col2,
    :_col3,
    :_col1,
    CURRENT_DATE
);
Copy

Snowflake(Python)

 #*** Generated code is based on the SnowConvert Python Helpers version 2.0.6 ***
#** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "TESTS.EmpLoad4" **
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
#** SSC-FDM-TD0022 - SHELL VARIABLES FOUND, RUNNING THIS CODE IN A SHELL SCRIPT IS REQUIRED **
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. TRANSLATED BELOW AS AN ASSIGNMENT STATEMENT **
  #SET RECORD VARTEXT "" ""
   
  ssc_set_record = ""
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. TRANSLATED BELOW AS ASSIGNMENT STATEMENTS **
  #DEFINE _col1 (CHAR(10)), _col2 (CHAR(7)), _col3 (CHAR(2, NULLIF = 'V5')) FILE = inputDataNoDel.txt
   
  ssc_define_columns = "_col1 (CHAR(10)), _col2 (CHAR(7)), _col3 (CHAR(2, NULLIF = 'V5'))"
  #Set file name manually if empty
  ssc_define_file = f"""inputDataNoDel.txt"""
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. TRANSLATED BELOW **
  #BEGIN LOADING TESTS.EmpLoad4 ERRORFILES ${CPRDBName}.ET_${LOADTABLE}, ${CPRDBName}.UV_${LOADTABLE} CHECKPOINT 1000
   
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. TRANSLATED BELOW AS PART OF THE BEGIN LOADING TRANSLATION **
  #INSERT INTO TESTS.EmpLoad4 (col2, col3, col1, col4) VALUES (:_col2, :_col3, :_col1, CURRENT_DATE)
   
  ssc_begin_loading_columns = "(col2, col3, col1, col4)"
  ssc_begin_loading_values = [":_col2", ":_col3", ":_col1", "CURRENT_DATE()"]
  BeginLoading.import_file_to_table(f"""TESTS.EmpLoad4""", ssc_define_columns, ssc_define_file, ssc_begin_loading_columns, ssc_begin_loading_values, ssc_set_record)
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy

内部的には、 import_file_to_table 関数は仮ステージを作成し、指定されたテーブルにロードするためにローカルファイルをステージに置きます。ただし、ファイルは Snowflake がサポートするクラウドプロバイダーのいずれかに既に保存されている可能性があります。

StageInput Data Place Holder
StageInput Data Place Holder
Internal stage@my_int_stage
External stage@my_int_stage/path/file.csv
Amazon S3 buckets3://mybucket/data/files
Google Cloud Storagegcs://mybucket/data/files
Microsoft Azureazure://myaccount.blob.core.windows.net/mycontainer/data/files

この場合は、 import_file_to_table 関数に、 input_data_place_holder="<cloud_provider_path>" という追加パラメーターを手動で追加してください。例:

 BeginLoading.import_file_to_table(
  f"""TESTS.EmpLoad4""", 
  ssc_define_columns, 
  ssc_define_file, 
  ssc_begin_loading_columns, 
  ssc_begin_loading_values, 
  ssc_set_record,
  input_data_place_holder="s3://mybucket/data/files")
Copy

END LOADING

BEGIN LOADING の変換には必要ないため、END LOADING コマンドはコメントアウトされています。

Teradata(FastLoad)

 END LOADING;
Copy

Snowflake(Python)

 #*** Generated code is based on the SnowConvert Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  #** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. END LOADING **
  #END LOADING
   
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy

既知の問題

1.BINARY および TEXT キーワード指定はサポートされていません

SET RECORD コマンドの BINARY および TEXT キーワード指定はまだサポートされていません。

2.VARTEXT の基本仕様のみサポートされています

TRIMQUOTE のような SET RECORD VARTEXT の追加仕様はまだサポートされていません。

関連 EWIs

  1. SSC-FDM-0007: 依存関係のない要素。

  2. SSC-FDM-0027: 次のステートメントを削除しました。 SnowFlake には適用されません。

  3. SSC-EWI-0021: サポートされていません。

  4. SSC-FDM-TD0022: シェル変数が見つかりました。このコードをシェルスクリプトで実行する必要があります。