SnowConvert AI - Teradata - MLOAD

Teradata MLOAD ファイルをPythonに変換するための翻訳リファレンス

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

To simulate the MultiLoad functionality for Teradata in Snowflake, MultiLoad files and commands are transformed to Python code, similar to the transformations performed for BTEQ and FastLoad scripts. The generated code uses the Snowflake Python project called snowconvert.helpers which contains the required functions to simulate the MultiLoad statements in Snowflake.

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](mailto: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;

Snowflake(Python)

#*** Generated code is based on the SnowConvert AI 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()

.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 );

Snowflake(Python)

#*** Generated code is based on the SnowConvert AI 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()

.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;

Snowflake(Python)

#*** Generated code is based on the SnowConvert AI 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()

大容量の例

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

この入力データで:

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

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;

結果

ROWIDNAMEAGE
1NULLohn25
22aria29
33arlos31
44ike40
55aura27

Snowflake(Python)

クエリ

#*** Generated code is based on the SnowConvert AI Python Helpers version 2.0.6 ***
#** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "mySampleTable1" **
 
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 UPPER(RTRIM(ID)) = UPPER(RTRIM('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()

結果

ROWIDNAMEAGE
1NULLohn25
22aria29
33arlos31
44ike40
55aura27

既知の問題

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

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

In the example below, :EmpNo is pointing to a LAYOUT defined column. However, the transformation does not take this into account and thus the code will be referencing a column that does not exist.

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

この文書に関してご質問がある場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)まで電子メールをお送りください。