SnowConvert AI - Teradata - MLOAD¶
Teradata MLOAD파일을 Python으로 변환하기 위한 변환 참조
Teradata MultiLoad 는 Teradata 데이터베이스의 여러 테이블 및 뷰에 대한 빠른 대용량 유지 관리를 위한 명령 기반 유틸리티입니다.
Snowflake에서 Teradata의 MultiLoad 기능을 시뮬레이션하기 위해 MultiLoad 파일과 명령은 BTEQ 및 FastLoad 스크립트에 대해 수행된 변환과 유사하게 Python 코드로 변환됩니다. 생성된 코드는 Snowflake의 MultiLoad 문을 시뮬레이션하는 데 필요한 함수가 포함된 snowconvert.helpers라는 Snowflake Python 프로젝트를 사용합니다.
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으로 이메일을 보내주세요.
BEGIN MLOAD¶
.BEGIN MLOAD 명령에 대한 변환은 동작을 올바르게 시뮬레이션하려면 .LAYOUT, .FIELD, .FILLER, .DMLLABEL, .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()
Large 예제¶
다양한 명령에 대해 위에 표시된 변환이 주어지면 다음 예를 고려하십시오.
이 입력 데이터로:
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 |
Known Issues¶
1. 삭제 문은 부분적으로 지원됩니다
DELETE 문은 LAYOUT 정의된 열을 가리키는 경우 where 조건이 발견되면 올바르게 변환되지 않으므로 부분적으로 지원됩니다.
아래 예제에서 :EmpNo 는 LAYOUT 정의된 열을 가리키고 있습니다. 그러나 변환은 이를 고려하지 않으므로 코드가 존재하지 않는 열을 참조하게 됩니다.
exec("""
DELETE FROM
Employee
WHERE
EmpNo = :EmpNo
""")
이 설명서와 관련하여 추가 질문이 있는 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.