SnowConvert AI - Teradata - MLOAD¶
Teradata MLOAD ファイルをPythonに変換するための翻訳リファレンス
Teradata MultiLoad は、Teradataデータベースの複数のテーブルとビューを高速かつ大量にメンテナンスするためのコマンド駆動型ユーティリティです。
SnowflakeでTeradataの MultiLoad 機能をシミュレートするために、 BTEQ、FastLoad スクリプトの変換と同様に、 MultiLoad ファイルとコマンドをPythonコードに変換します。生成されたコードは、[snowconvert.helpers](snowconvert-script-helpers)と呼ばれるSnowflake Pythonプロジェクトを使用しています。このプロジェクトには、Snowflakeの MultiLoad ステートメントをシミュレートするために必要な機能が含まれています。
MultiLoad コマンド翻訳¶
MultiLoad コマンド のほとんどはSnowflakeでは関係ないと考えられているため、これらのコマンドはコメントアウトされています。以下は、MultiLoad コマンドの概要リストとSnowflakeへの変換ステータスです。
| Commands | Transformation Status | Note |
|---|---|---|
| ACCEPT | Commented | |
| BEGIN MLOAD | Transformed | The node is commented out since the transformation occurs in other related statements instead. |
| BEGIN DELETE MLOAD | Commented | |
| DATEFORM | Commented | |
| DELETE | Partially transformed | Check known issues. |
| DISPLAY | Commented | |
| DML LABEL | Transformed | |
| END MLOAD | Transformed | Commented out since is not necessary for the transformation of the BEGIN MLOAD. |
| EOC | Commented | |
| FIELD | Transformed | |
| FILLER | Transformed | This command needs to be with a FIELD and LAYOUT command to be converted. |
| IF, ELSE, and ENDIF | Commented | |
| IMPORT | Transformed | |
| INSERT | Transformed | This is taken as a Teradata Statement, so it doesn't appear in this chapter. |
| LAYOUT | Transformed | This command needs to be with a FIELD and FILLER command to be converted. |
| LOGDATA | Commented | |
| LOGMECH | Commented | |
| LOGOFF | Commented | |
| LOGON | Commented | |
| LOGTABLE | Commented | |
| PAUSE ACQUISITION | Commented | |
| RELEASE MLOAD | Commented | |
| ROUTE MESSAGES | Commented | |
| RUN FILE | Commented | |
| SET | Commented | |
| SYSTEM | Commented | |
| TABLE | Commented | |
| UPDATE | Transformed | This is taken as a Teradata Statement, so it doesn't appear in this chapter. |
| VERSION | Commented | |
しかし、いくつかの例外的なコマンドは、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 コマンドの後には通常、 Insert、 Update、または 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;
結果
| ROW | ID | NAME | AGE |
|---|---|---|---|
| 1 | NULL | ohn | 25 |
| 2 | 2 | aria | 29 |
| 3 | 3 | arlos | 31 |
| 4 | 4 | ike | 40 |
| 5 | 5 | aura | 27 |
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()
結果
| ROW | ID | NAME | AGE |
|---|---|---|---|
| 1 | NULL | ohn | 25 |
| 2 | 2 | aria | 29 |
| 3 | 3 | arlos | 31 |
| 4 | 4 | ike | 40 |
| 5 | 5 | aura | 27 |
既知の問題¶
1.Deleteステートメントは部分的にサポートされています
LAYOUT で定義された列を指している場合、where条件が見つかると正しく変換されないため、DELETE ステートメントは部分的にサポートされています。
以下の例では、 :EmpNo は LAYOUT で定義された列を指しています。ただし、変換ではこの点が考慮されないため、コードは存在しない列を参照することになります。
exec("""
DELETE FROM
Employee
WHERE
EmpNo = :EmpNo
""")
この文書に関してご質問がある場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)まで電子メールをお送りください。