SnowConvert: Teradata Scripts - 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
변환된 코드
## Some comments on the job
class LOADJOB:
# DESCRIPTION 'LOAD AC_SCHEMA TABLE FROM A FILE'
JobBody
스키마 변환 정의하기¶
스키마 문은 작업 문에 대해 생성된 클래스의 특성으로 변환됩니다.
소스 코드
DEFINE SCHEMA DCS_SCHEMA
DESCRIPTION 'DCS DATA'
(
PNRHEADER_ID PERIOD(DATE),
PNRLOCPERIOD PERIOD(TIMESTAMP(0)),
CRTDATE CLOB,
REQTYP JSON(100000),
seqno INTEGER,
resdata INTEGER
);
변환된 코드
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,
);"""
연산자 변환 정의하기¶
연산자는 작업에 대해 생성된 클래스 내부에서 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']
);
변환된 코드
class JobName:
def DDL_OPERATOR(self):
#'TERADATA PARALLEL TRANSPORTER DDL OPERATOR'
global args
self.con = log_on(user = args.MyUserName, password = 'SomePassWord')
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'
);
변환된 코드
class JobName:
def LOAD_OPERATOR(self, query):
#'TERADATA PARALLEL TRANSPORTER LOAD OPERATOR'
#USES SCHEMA AC_MASTER_SCHEMA
operator_name = "LOAD_OPERATOR"
return query
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'
);
변환된 코드
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
단계 변환 정의¶
작업을 위해 생성된 클래스 내에서 단계가 너무 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);
);
변환된 코드
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() )})""")
주요 함수¶
메인 함수는 항상 모든 스크립트 언어에 대해 생성되며, TPT 의 경우 메인 함수에는 작업 클래스의 인스턴스와 작업의 단계에 대한 호출이 포함됩니다
주요 함수 샘플 코드
def main():
_LOADJOB = LOADJOB()
_LOADJOB.setup_tables()
_LOADJOB.stLOAD_FILE_NAME()
snowconvert.helpers.quit_application()
MLOAD¶
Teradata MultiLoad 는 Teradata 데이터베이스의 여러 테이블 및 뷰에 대한 빠른 대용량 유지 관리를 위한 명령 기반 유틸리티입니다.
MultiLoad 파일 및 명령은 BTEQ 및 FastLoad 스크립트에 대해 수행된 변환과 유사하게 Python 코드로 변환되어, Snowflake에서 Teradata의 MultiLoad 기능을 시뮬레이션합니다. 생성된 코드는 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 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 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 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 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()
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으로 이메일을 보내주시기 바랍니다.
SnowConvert 스크립트 헬퍼¶
SnowConvert 는 모든 Teradata SQL 또는 스크립트(BTEQ, FastLoad, MultiLoad, TPump)를 가져와 기능적으로 동등한 Snowflake SQL, JavaScript 에 내장된 Snowflake SQL 및 Python으로 변환할 수 있습니다. SnowConvert 의 모든 출력 Python 코드는 이러한 헬퍼 클래스의 함수를 호출하여 변환을 완료하고 기능적으로 동등한 출력을 Snowflake에서 생성합니다.
또한 Snowflake 계정에 연결하고 SnowConvert 에서 생성한 출력 Python 코드를 실행하기 위해 Python용 Snowflake Connector 가 호출됩니다.
패키지의 최신 버전 정보는 여기 에서 확인할 수 있습니다.
참고
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);
출력¶
아래와 같은 출력이 표시됩니다.
The `log_on`function parameters ('user', 'password', 'account', 'database', 'warehouse', 'role', 'token') should be defined by the user.
#*** 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()
시작하기¶
패키지를 설치하려면 Python 환경에서 다음 명령을 실행해야 합니다. Python에서 패키지를 설치하는 데 익숙하지 않은 경우 다음 페이지(https://packaging.python.org/tutorials/installing-packages/)를 참조하십시오.
pip install snowconvert-helpers
패키지가 설치되면 Python에서 스크립트 마이그레이션된 코드를 실행할 수 있습니다.
코드 실행¶
마이그레이션된 코드를 실행하려면 명령 프롬프트
또는 터미널
을 열고 다음 명령을 실행하기만 하면 됩니다.
python sample_BTEQ.py
스크립트에 오류가 없으면 콘솔에 아래와 같은 출력이 표시됩니다.
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
연결 매개 변수 전달하기¶
데이터베이스 연결에 연결 매개 변수를 전달하는 방법에는 여러 가지가 있습니다.
함수의 매개 변수로 Python 파일 내에서 snowconvert.helpers.log_on을 호출합니다.
명령줄에서 Python이 실행될 때 사용자, 비밀번호, 계정, 데이터베이스, 웨어하우스, 역할의 특정 순서를 가진 위치 매개 변수입니다.
명령줄에서 python이 실행될 때 SNOW_USER, SNOW_PASSWORD, SNOW_ACCOUNT, SNOW_DATABASE, SNOW_WAREHOUSE, SNOW_ROLE, SNOW_QUERYTAG, SNOWAUTHENTICATOR 및 SNOWTOKEN 의 순서 제한이 없는 명명된 매개 변수로, –param-VARNAME=VALUE 와 같이 전달됩니다.
환경 변수로 SNOW_USER, SNOW_PASSWORD, SNOW_ACCOUNT, SNOW_DATABASE, SNOW_WAREHOUSE, SNOW_ROLE, SNOW_QUERYTAG, SNOWAUTHENTICATOR 및 SNOWTOKEN 라는 이름으로 Python 실행 전에 설정합니다.
지정된 이전 순서는 우선순위를 결정하는 방식입니다.
함수 호출의 매개 변수¶
다음과 같이 함수 호출에서 위치 매개 변수로 설정할 수 있습니다.
.....
con = snowconvert.helpers.log_on(
'myuser',
'mypassword',
'myaccount',
'mydatabase',
'mywarehouse',
'myrole',
5,
'myauthenticator',
'mytoken')
.....
또는 다음과 같이 함수 호출에서 원하는 순서대로 명명된 매개 변수를 설정할 수 있습니다.
.....
con = snowconvert.helpers.log_on(
account:'myaccount',
password:'mypassword',
user:'myuser',
warehouse:'mywarehouse',
login_timeout:5,
authenticator:'myauthenticator',
toke:'mytoken')
.....
위치 매개 변수¶
명령줄에서 다음과 같이 특정 순서로 설정해야 합니다.
python sample_BTEQ.py myuser mypassword myaccount mydatabase mywarehouse myrole myauthenticator mytokenr
또는 일부 매개 변수만 설정할 수 있지만 항상 다음과 같이 사용자 매개 변수부터 시작할 수 있습니다.
python sample_BTEQ.py myuser mypassword myaccount
명명된 매개 변수¶
명명된 매개 변수는 다음과 같이 명령줄에서 원하는 순서대로 설정할 수 있습니다(가독성을 위해 한 라인로 표시하고 여러 라인로 표시).
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
환경 변수¶
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
export SNOW_AUTHENTICATOR=VALUE
export SNOW_USER=myuser
export SNOW_PASSWORD=mypassword
python3 sample_BTEQ.py
로그 활성화¶
로깅을 활성화하려면 SNOW_LOGGING 이라는 환경 변수를 true로 설정해야 합니다.
그런 다음 로깅 구성을 사용자 정의하려면 다음과 같이 snowconvert.helpers.configure_log()
메서드에 매개 변수를 전달할 수 있습니다.
snowconvert.helpers.configure_log("SOMEPATH.conf")
구성 파일에는 다음 구조가 포함되어야 합니다. 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
Snowflake¶
마이그레이션한 코드가 실행되면 Snowflake로 이동하여 변경 사항이나 배포를 확인할 수 있습니다.
select * from PUBLIC.table1;
위의 예에서 삽입한 행을 볼 수 있습니다.
로컬 헬퍼 설명서¶
우선, pydoc이라는 이름의 Python 패키지를 설치해야 합니다(snowconvert-helpers 버전 2.0.2부터 사용 가능).
pip install pydoc
그런 다음 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
이 디렉터리에 위치해야 실행할 수 있습니다.
python -m pydoc -b
콘솔은 설치된 모든 패키지에 대한 설명서의 HTML 도움말과 함께 선호하는 브라우저를 엽니다.
D:\bteq\Output>python -m pydoc -b
Server ready at http://localhost:61355/
Server commands: [b]rowser, [q]uit
server>
그러면 다음과 같은 코드 설명서가 있는 브라우저가 열립니다.
페이지 끝으로 스크롤하여 설치된 패키지를 확인합니다. 그리고 다음과 유사하게 표시됩니다.
SnowConvert(package)를 클릭하면 다음과 같은 내용이 표시됩니다.
모듈 헬퍼를 클릭하면 다음과 유사한 화면이 표시됩니다.
그런 다음 모듈의 함수와 클래스를 스크롤할 수 있습니다.
알려진 문제 ¶
문제가 발견되지 않았습니다.
관련 EWIs ¶
관련 EWIs 없음.
기술 설명서¶
함수¶
프로젝트에 정의된 모든 함수.
액세스¶
**`access`**`(path, mode, *, dir_fd=None, effective_ids=False, follow_symlinks=True)`
설명:¶
경로에 대한 액세스를 테스트하려면 실제 UID/GID를 사용하십시오
dir_fd, effective_ids, and follow_symlinks는 플랫폼에서 구현되지 않을 수 있습니다. 사용할 수 없는 경우 이를 사용하면 NotImplementedError 가 표시됩니다.
대부분의 작업은 유효한 UID/GID를 사용하므로 이 루틴은 호출하는 사용자가 경로에 대해 지정된 액세스 권한을 가지고 있는지 테스트하기 위해 suid/sgid 환경에서 사용할 수 있습니다.
매개 변수:¶
path,
테스트할 경로; 문자열, 바이트 또는 경로와 유사한 오브젝트 일 수 있습니다모드,
운영 체제 모드 비트필드. 존재를 테스트할 OK 또는 R_OK, W_OK 및 X_OK의 포함 OR 일 수 있음dir_fd,
없음이 아니라면 디렉터리에 열려있는 파일 설명자여야 하며, 경로는 상대적이어야 합니다. 그러면 경로는 해당 디렉터리에 상대적입니다effective_ids,
true이면 액세스는 실제 uid/gid 대신 유효 uid/gid를 사용합니다follow_symlinks,
false이고 경로의 마지막 요소가 심볼릭 링크인 경우 액세스는 링크가 가리키는 파일 대신 심볼릭 링크 자체를 검사합니다
at_exit_helpers¶
**`at_exit_helpers`**`()`
설명:¶
스크립트 실행 종료 시 실행됩니다.
colored¶
**`colored`**`(text, color='blue')`
설명:¶
지정된 색상에서 컬러 텍스트를 인쇄합니다.
매개 변수:¶
text
,
인쇄할 텍스트color="blue"
,
인쇄할 색상
configure_log¶
**`configure_log`**`(configuration_path)`
설명:¶
Snowflake 연결에서 데이터 관련 실행에 대해 수행할 로깅을 구성합니다. 로그 파일의 이름은 기본적으로 ‘Snowflake_python_connector.log’입니다.
매개 변수:
configuration_path
,
로깅에 필요한 모든 설정이 포함된 파일의 구성 경로입니다
drop_transient_table¶
**`drop_transient_table`**`(tempTableName, con=None)`
설명:¶
지정된 이름의 일시적 테이블을 삭제합니다
매개 변수:
tempTableName
,
임시 테이블의 이름con=None
,
사용할 연결, None이 전달되면 마지막으로 수행된 연결을 사용합니다
exception_hook¶
**`exception_hook`**`(exctype, value, tback)`
설명:¶
매개 변수:
exctype
값
tback
exec¶
**`exec`**`(sql_string, using=None, con=None)`
설명:¶
마지막 연결을 사용하여 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)`
설명:¶
파일의 내용을 읽고 지정된 연결에 포함된 SQL 문을 실행합니다.
매개 변수:
filename
,
읽고 실행할 파일 이름con=None
,
사용할 연결, None이 전달되면 마지막으로 수행된 연결을 사용합니다
exec_os¶
**`exec_os`**`(command)`
설명:¶
연산자 시스템에서 명령을 실행합니다.
exec_sql_statement¶
**`exec_sql_statement`**`(sql_string, con, using=None)`
설명:¶
전달된 연결에서 선택적 인자와 함께 SQL 문을 실행합니다.
매개 변수:
sql_string
,
실행할 문자열이 포함된 sql입니다con
,
사용할 연결using
,
sql 실행에 사용할 선택적 매개 변수
expands\using_params**¶
**`expands_using_params`**`(statement, params)`
설명:¶
매개 변수와 함께 전달된 문을 확장합니다.
매개 변수:
statement
,
실행할 문자열을 포함하는 sqlparams
,
sql 문의 매개 변수
expandvar¶
**`expandvar`**`(str)`
설명:¶
전달된 문자열에서 변수를 확장합니다
매개 변수:
str
,
변수와 함께 확장할 문자열입니다
expandvars¶
**`expandvars`**`(path, params, skip_escaped=False)`
설명:¶
_var 및 ${var} 형식의 환경 변수를 확장합니다. 매개 변수 ‘skip_escaped’가 true이면 이스케이프된 모든 변수 참조(즉, 백슬래시 앞에 오는)를 건너뜁니다. 알 수 없는 변수는 ‘기본값’으로 설정됩니다. ‘default’ 값이 없음이면 변경되지 않은 상태로 유지됩니다
매개 변수:
path
,
params
,
skip_escaped=False
,
FAST LOAD¶
**`fast_load`**`(target_schema, filepath, stagename, target_table_name, con=None)`
설명:¶
전달된 매개 변수 target_schema, filepath, stagename and target_table_name을 사용하여 빠른 로딩을 실행합니다.
매개 변수:
target_schema
,
빠른 로딩에 사용할 스키마의 이름입니다filepath
,
테이블에 로딩할 파일 이름 경로target_table_name
,
데이터가 로딩될 테이블의 이름입니다con=None
,
사용할 연결, None이 전달되면 마지막으로 수행된 연결을 사용합니다
file\exists_and_readable**¶
**`file_exists_and_readable`**`(filename)`
설명:¶
매개 변수:
filename
,
get\argkey**¶
**`get_argkey`**`(astr)`
설명:¶
전달된 문자열에서 인자 키 값을 가져옵니다. 문자열 ‘–param-‘로 시작해야 합니다
매개 변수:
astr
,
사용할 인자 문자열입니다. 문자열은 –param-column=32와 유사한 값을 가져야 하며 반환 값은 ‘32’가 됩니다
get\error_position**¶
**`get_error_position`**`()`
설명:¶
생성된 오류의 스택 정보를 사용하여 파일에서 오류 위치를 가져옵니다.
get\from_vars_or_args_or_environment**¶
**`get_from_vars_or_args_or_environment`**`(arg_pos, variable_name, vars, args)`
설명:¶
지정된 위치에서 인자를 가져오거나 테이블 변수에서 값을 가져오거나 전달된 환경 변수 이름을 가져옵니다.
매개 변수:
arg_pos
,
인자 매개 변수에서 사용할 인자 위치variable_name
,
구할 변수의 이름입니다vars
,
변수 이름과 값이 포함된 해시args
,
인자 배열 매개 변수
import\data_to_temptable**¶
**`import_data_to_temptable`**`(tempTableName, inputDataPlaceholder, con)`
설명:¶
입력 데이터 플레이스 홀더를 사용하여 임시 테이블로 데이터를 가져옵니다.
매개 변수:
tempTableName,
임시 테이블 이름입니다.inputDataPlaceholder,
입력된 플레이스 홀더는 Snowflake 데이터베이스의 스테이지입니다con,
사용할 연결
import\file**¶
**`import_file`**`(filename, separator=' ')`
설명:¶
전달된 파일 이름을 선택적 구분 기호와 함께 가져옵니다.
매개 변수:
filename,
가져올 파일 이름 경로separator=' ',
선택적 구분자
import\file_to_temptable**¶
**`import_file_to_temptable`**`(filename, tempTableName, columnDefinition)`
설명:¶
임시 테이블로 전달된 파일을 가져옵니다. 접두사가 Stage_인 임시 테이블로 명명된 공개 스테이지를 사용합니다. 임시 테이블에 로딩이 끝나면 프로세스에 사용 된 스테이지가 삭제됩니다._
매개 변수:
filename,
읽을 파일의 이름입니다tempTableName,
임시 테이블의 이름columnDefinition,
임시 테이블을 가질 모든 필드의 정의
import\reset**¶
**`import_reset`**`()`
설명:¶
로그¶
**`log`**`(*msg, level=20, writter=None)`
설명:¶
로깅 활성화 여부에 따라 콘솔(표준 출력) 또는 로그 파일에 메시지를 인쇄합니다
매개 변수:
*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)`
설명:¶
자격 증명, 데이터베이스, 웨어하우스, 역할, login_timeout 및 인증자 전달 매개 변수를 사용하여 Snowflake 데이터베이스에 로그합니다.
매개 변수:
user,
데이터베이스의 사용자password
데이터베이스 사용자의 비밀번호입니다database,
연결할 데이터베이스warehouse,
연결할 데이터베이스의 웨어하우스role,
연결할 역할login_timeout,
연결에 너무 오래 걸리는 경우 오류를 표시하기 전 최대 시간 제한입니다authenticator,
SNOWFLAKE, EXTERNALBROWSER, SNOWFLAKE_JWT 또는 OAUTH 와 같이 사용할 인증자 지원 값token,
OAUTH 또는 JWT 토큰
os¶
**`os`**`(args)`
설명:¶
매개 변수:
args,
print\table**¶
**`print_table`**`(dictionary)`
설명:¶
사용자 및 비밀번호 값을 노출하지 않고 사전을 인쇄합니다.
매개 변수:
dictionary,
quit\application**¶
**`quit_application`**`(code=None)`
설명:¶
애플리케이션을 종료하고 선택적으로 전달된 코드를 반환합니다.
매개 변수:
code=None,
종료 후 반환할 코드입니다
read\params_args**¶
**`read_param_args`**`(args)`
설명:¶
전달된 배열에서 매개 변수 인자를 읽습니다
매개 변수:
args,
사용할 인자
readrun¶
**readrun**(line, skip=0)
설명:¶
지정된 파일 이름 라인을 읽고 파일 시작 부분의 일부 라인을 선택적으로 건너뜁니다
매개 변수:
라인,
읽을 파일 이름skip=0,
건너뛸 라인은 다음과 같습니다
remark¶
**remark**(arg)
설명:¶
인자를 인쇄합니다.
매개 변수:
arg,
인쇄할 인자
repeat\previous_sql_statement**¶
**`repeat_previous_sql_statement`**`(con=None, n=1)`
설명:¶
이전에 실행된 sql 문을 반복합니다.
매개 변수:
con=None,
지정된 경우 연결. 전달되지 않으면 마지막으로 수행된 연결 성능을 사용합니다n=1,
다시 실행할 이전 문 수
set\default_error_level**¶
**`set_default_error_level`**`(severity_value)`
설명:¶
매개 변수:
severity_value,
set\error_level**¶
**`set_error_level`**`(arg, severity_value)`
설명:¶
매개 변수:
arg,
severity_value,
simple\fast_load**¶
**`simple_fast_load`**`(con, target_schema, filepath, stagename, target_table_name)`
설명:¶
연결과 전달된 매개 변수 target_schema, 파일 경로, 스테이지 이름 및 대상 테이블 이름에서 간단한 빠른 로딩을 실행합니다.
매개 변수:
arg,
사용할 연결target_schema,
빠른 로딩에 사용할 스키마의 이름입니다filepath,
테이블에 로딩할 파일 이름 경로target_table_name,
데이터가 로딩될 테이블의 이름입니다
stat¶
**`stat`**`(path, *, dir_fd=None, follow_symlinks=True)`
설명:¶
_지정된 경로에서 통계 시스템 호출을 수행합니다._dir_fd 및 follow_symlink는 플랫폼에서 구현되지 않을 수 있습니다. 사용할 수 없는 경우 이를 사용하면 NotImplementedError 가 발생합니다. 열린 파일 설명자로 경로를 지정할 때 dir_fd 또는 follow_symlinks를 사용하는 것은 오류입니다
매개 변수:
path,
검사할 경로; 문자열, 바이트, 경로와 유사한 오브젝트 또는\open-file-descriptor int일 수 있습니다dir_fd,
없음이 아닌 경우 디렉터리에 열려있는 파일 설명자이어야 하며, 경로는 상대 문자열이어야 합니다. 그러면 경로는 해당 디렉터리에 상대적입니다follow_symlinks,
false이고 경로의 마지막 요소가 심볼릭 링크인 경우, stat는 링크가 가리키는 파일 대신 심볼릭 링크 자체를 검사합니다
system¶
**`system`**`(command)`
설명:¶
서브셸에서 명령을 실행합니다.
매개 변수:
_
command
_,
using¶
**`using`**`(*argv)`
설명:¶
매개 변수:
_
*argv
_,
클래스¶
프로젝트에 정의된 모든 클래스
BeginLoading 클래스¶
이 클래스에는 BEGIN LOADING 및 FastLoad 의 관련 명령을 지원하는 import_file_to_tab
정적 함수가 포함되어 있습니다.
import_file_to_tab()
¶
매개 변수:
target_schema_table
대상 스키마(선택 사항) 및 테이블 이름
define_file
읽을 파일의 이름입니다
define_columns
임시 테이블의 모든 열에 대한 정의입니다
begin_loading_columns
삽입할 열 이름입니다. 값이 삽입되는 순서를 지정합니다
begin_loading_values
변환할 원시 삽입 값 목록
field_delimiter
필드 구분 기호
(선택 사항)
skip_header
건너뛸 행 수입니다
(선택 사항)
input_data_place_holder
지원되는 클라우드 공급자에서 파일의 위치입니다. 파일이 로컬에 저장되지 않은 경우 매개 변수 설정
(선택 사항)
con
사용할 연결은 다음과 같습니다
Export 클래스¶
클래스의 정적 메서드
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 = ''
\
Import 클래스¶
클래스의 메서드
reset()
클래스의 정적 메서드
file(file, separator=' ')
using(globals, *argv)
클래스에 정의된 데이터 및 기타 특성
expandedfilename = None
no_more_rows = False
read_obj = None
reader = None
separator = ' '
Parameters
클래스¶
클래스에 정의된 데이터 및 기타 특성
passed_variables = {}
¶
BTEQ¶
기본 Teradata 쿼리(BTEQ)는 워크스테이션의 사용자가 1개 이상의 Teradata 데이터베이스 시스템과 통신하고 인쇄 및 화면 출력용 보고서 형식을 지정할 수 있는 범용 명령 기반 프로그램입니다.
BTEQ 파일 및 명령은 MultiLoad 및 FastLoad 스크립트에 대해 수행된 변환과 유사하게 Python 코드로 변환되어, Snowflake에서 Teradata의 BTEQ 기능을 시뮬레이션합니다. 생성된 코드는 Snowflake의 BTEQ 문을 시뮬레이션하는 데 필요한 필수 함수가 포함된 snowconvert.helpers라는 Snowflake Python 프로젝트를 사용합니다.
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 |
snowconvert.helpers.error_code != 0인 경우: snowconvert.helpers.quit_application (snowconvert.helpers.error_code) |
|
.IMPORT RESET |
snowconvert.helpers.import_reset() |
이 함수에는 기능이 없습니다 |
.LABEL newLabel |
def NEWLABEL(): |
|
.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;
위의 예제에서는 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()
FIRSTLABEL
_ 함수에 대한 호출이 있으며, 이 함수에는 원래 코드에서 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);
이는 다음과 같이 변환됩니다.
#*** 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()
스크립트 파일 실행하기¶
사용자의 BTEQ 명령과 Teradata SQL 문이 포함된 파일을 스크립트, 실행 파일, 매크로 또는 저장 프로시저라고 합니다. 예를 들어, SAMPFILE 이라는 파일을 생성하고 다음 BTEQ 스크립트를 입력합니다.
.LOGON tdpid/userid,password
SELECT * FROM department;
.LOGOFF
실행 파일을 실행하려면 BTEQ RUN 명령어 중 하나를 입력합니다.
.RUN FILE=sampfile
두 번째 코드를 변환하면 결과는 다음과 같습니다.
#*** 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()
snowconvert.helpers.readrun("sampfile")
은 SAMPFILE 에서 각 라인을 반환하고, FOR
문에서 각 라인은 전달된 식을 구문 분석하여 프로그램 내에서 Python 식(SAMPFILE 이 작동하도록 변환되어야 함)을 실행하는 함수인 eval
함수로 전달됩니다.
SQL 파일 실행¶
BTEQ 파일을 실행하는 동안 SQL 파일을 찾을 수 있는 인스턴스도 있습니다. 예를 들어, SQL 파일을 NEWSQL 이라고 합니다.
CREATE TABLE aTable (aColumn BYTEINT);
다음 라인이 포함된 스크립트 중에 실행할 수 있습니다.
$(<$NEWSQL)
그리고 스크립트를 변환한 후 결과는 다음과 같습니다.
#*** 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()
exec_file
헬퍼 함수는 NEWSQL 파일에서 각 라인을 읽은 다음 쿼리문 실행하기 섹션에 설명된 대로 실행 함수를 사용합니다.
알려진 문제 ¶
문제가 발견되지 않았습니다.
관련 EWIs ¶
문제가 발견되지 않았습니다.
REPEAT¶
참고
출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.
Teradata 설명서 에 따르면, REPEAT 문을 통해 사용자는 다음 SQL 요청을 제출할 최대 횟수를 지정할 수 있습니다. SQL 요청은 단일 또는 다중 문 요청일 수 있습니다. 이는 REPEAT 문 뒤에 오는 각 문의 세미콜론 위치에 따라 정의됩니다.
구문¶
REPEAT [ n [ PACK p [ REQBUFLEN b ] ] | * | RECS r]
<sql_request>
샘플 소스 패턴¶
이 입력 데이터로:
A B C
D E F
G H I
* [
] *
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);
C1 | C2 |
---|---|
A | X |
D | X |
G | X |
B | Y |
E | Y |
H | Y |
C | Z |
F | Z |
I | Z |
? | _ |
? | _ |
? | _ |
* | null |
[ | null |
MY_NAME | MY_AGE |
---|---|
John Doe | 23 |
John Doe | 23 |
John Doe | 23 |
John Doe | 23 |
John Doe | 23 |
John Doe | 23 |
John Doe | 23 |
John Doe | 23 |
John Doe | 23 |
John Doe | 23 |
Bob Alice | 21 |
Bob Alice | 21 |
Bob Alice | 21 |
Bob Alice | 21 |
Bob Alice | 21 |
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()
C1 | C2 |
---|---|
A | X |
D | X |
G | X |
B | Y |
E | Y |
H | Y |
C | Z |
F | Z |
I | Z |
? | _ |
? | _ |
? | _ |
* | null |
[ | null |
MY_NAME | MY_AGE |
---|---|
John Doe | 23 |
John Doe | 23 |
John Doe | 23 |
John Doe | 23 |
John Doe | 23 |
John Doe | 23 |
John Doe | 23 |
John Doe | 23 |
John Doe | 23 |
John Doe | 23 |
Bob Alice | 21 |
Bob Alice | 21 |
Bob Alice | 21 |
Bob Alice | 21 |
Bob Alice | 21 |
알려진 문제 ¶
문제가 발견되지 않았습니다.
관련 EWIs ¶
관련 EWIs 없음.
USING REQUEST MODIFIER¶
Some parts in the output code are omitted for clarity reasons.
Teradata 설명서 에 따르면, USING REQUEST MODIFIER 는 데이터를 가져오거나 내보내기 위해 후속 SELECT
, INSERT
, UPDATE
또는 DELETE
문에서 사용할 하나 이상의 매개 변수 이름을 정의합니다.
이 문의 구문은 다음과 같습니다.
USING ( <using_spec> [,...] ) SQL_request
<using_spec> ::= using_variable_name data_type [ data_type_attribute [...] ]
[ AS { DEFERRED [BY NAME] | LOCATOR } ]
Teradata 설명서에 명시된 대로, 정의된 매개 변수로 데이터를 로딩하려면 USING REQUEST MODIFIER 앞에 .IMPORT 문을 붙여야 합니다.
따라서 이 문에 대한 변환은 다음 단계를 따릅니다.
SnowConvert 헬퍼에서
import_file()
함수를 호출합니다. 이렇게 하면 임시 파일에 데이터가 로딩됩니다.SnowConvert 헬퍼에서
using()
함수를 호출하여 로딩된 데이터로 사전을 생성합니다.각 쿼리에 대해 SnowConvert 헬퍼에서
exec()
함수를 실행하고 이전에 정의한 사전을 전달합니다. 여기에는 Snowflake Python Connector 데이터 바인딩 기능이 사용됩니다.
이 입력 데이터로:
A,B,C
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;
ROW | C1 | C2 |
---|---|---|
1 | A | X |
2 | B | Y |
3 | C | Z |
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()
ROW | C1 | C2 |
---|---|---|
1 | A | X |
2 | B | Y |
3 | C | Z |
Known Issues¶
1. REPEAT 명령은 아직 지원되지 않습니다
.REPEAT
명령은 아직 지원되지 않습니다. 즉, USING REQUEST MODIFIER 는 입력 파일의 첫 번째 행에서 로딩된 데이터만 사용합니다. 따라서 쿼리는 한 번만 실행됩니다.
이 문제는 .REPEAT 명령이 적절한 변환 지원을 받으면 수정될 것입니다.
이 설명서와 관련하여 추가 질문이 있는 경우 snowconvert-support@Snowflake.com으로 이메일을 보내주시기 바랍니다.
관련 EWIs ¶
관련 EWIs 없음.
FLOAD¶
Teradata FastLoad 는 Teradata 데이터베이스의 빈 테이블에 대량의 데이터를 빠르게 로딩하기 위한 명령 기반 유틸리티입니다.
FastLoad 파일 및 명령은 BTEQ 및 MultiLoad 스크립트에 대해 수행된 변환과 유사하게 Python 코드로 변환되어, Snowflake에서 Teradata의 FastLoad 기능을 시뮬레이션합니다. 생성된 코드는 Snowflake의 FastLoad 문을 시뮬레이션하는 데 필요한 필수 함수가 포함된 snowconvert.helpers라는 Snowflake Python 프로젝트를 사용합니다.
FastLoad 명령 변환¶
대부분의 FastLoad 명령 은 Snowflake에서 관련이 없는 것으로 간주되며, 이러한 명령은 설명이 생략되어 있습니다. 아래는 FastLoad 명령의 요약 목록과 해당 명령이 Snowflake로 변환된 상태입니다.
Teradata FastLoad 명령 |
변환 상태 |
참고 |
---|---|---|
AXSMOD |
설명 추가됨 |
|
변환됨 |
관련 INSERT 문에서 변환이 발생하므로 노드에 설명이 생략되어 있습니다. |
|
CLEAR |
설명 추가됨 |
|
DATEFORM |
설명 추가됨 |
|
변환됨 |
|
|
변환됨 |
BEGIN LOADING 의 변환에 필요하지 않으므로 설명이 생략되었습니다. |
|
ERRLIMIT |
설명 추가됨 |
|
HELP |
설명 추가됨 |
|
HELP TABLE |
설명 추가됨 |
|
변환됨 |
BEGIN LOADING 의 일부로 변환됨. |
|
LOGDATA |
설명 추가됨 |
|
LOGMECH |
설명 추가됨 |
|
LOGOFF |
설명 추가됨 |
|
LOGON |
설명 추가됨 |
|
NOTIFY |
설명 추가됨 |
|
OS |
설명 추가됨 |
|
QUIT |
설명 추가됨 |
|
RECORD |
설명 추가됨 |
|
RUN |
설명 추가됨 |
|
SESSIONS |
설명 추가됨 |
|
변환됨 |
|
|
SET SESSION CHARSET |
설명 추가됨 |
|
SHOW |
설명 추가됨 |
|
SHOW VERSIONS |
설명 추가됨 |
|
SLEEP |
설명 추가됨 |
|
TENACITY |
설명 추가됨 |
|
기본 변환¶
이러한 문에 대한 ConversionTool 의 기본 동작은 문을 설명하는 것입니다. 예:
Teradata (FastLoad)
SESSIONS 4;
ERRLIMIT 25;
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()
그럼에도 불구하고 Snowflake에서 의도한 대로 작동하기 위해 특정 Python 문으로 변환해야 하는 몇 가지 예외가 있습니다.
임베디드 SQL¶
FastLoad 스크립트는 동일한 파일 내에서 Teradata 문을 지원합니다. 이러한 문의 대부분은 일부 예외를 제외하고 BTEQ 파일에 있는 것처럼 변환됩니다.
오류 테이블을 삭제하면 FastLoad 파일 안에 있는 경우 설명이 추가됩니다.
Teradata (FastLoad)
DROP TABLE Error1;
DROP TABLE Error2;
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()
Large 예제¶
다양한 명령에 대해 위에 표시된 변환이 주어지면 다음 예를 고려하십시오.
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;
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()
이 설명서와 관련하여 추가 질문이 있는 경우 snowconvert-support@Snowflake.com으로 이메일을 보내주시기 바랍니다.
Known Issues¶
문제가 발견되지 않았습니다.
관련 EWIs¶
SSC-FDM-0007: 종속성이 누락된 요소.
SSC-FDM-0027: next 문을 제거했으며 SnowFlake 에서 적용되지 않습니다.
BEGIN LOADING¶
BEGIN LOADING
명령에 대한 변환은 동작을 올바르게 시뮬레이션하기 위해 DEFINE
, INSERT
및 (선택 사항) SET RECORD
명령이 필요한 다중 부분 변환입니다.
이 변환에 대한 자세한 설명은 다음 하위 섹션에서 확인할 수 있습니다.
SET RECORD¶
위에서 설명한 것처럼 이 명령은 BEGIN LOADING 의 변환에 필요하지 않습니다. 찾을 수 없는 경우 기본 구분 기호는 ‘,’(쉼표)로 설정됩니다. 그렇지 않으면 정의된 구분 기호가 사용됩니다. 이 값은 ssc_set_record
변수에 저장됩니다.
현재는 SET RECORD VARTEXT
, SET RECORD FORMATTED
및 SET 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;
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()
DEFINE¶
DEFINE
명령에 대한 변환은 각각 열 정의 값과 BEGIN LOADING
변환에 사용할 파일 경로로 ssc_define_columns
및 ssc_define_file
변수를 설정합니다.
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;
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()
BEGIN LOADING¶
BEGIN LOADING
명령은 변환에 대한 관련 정보가 관련 INSERT
문에 있으므로 설명이 생략되어 있습니다.
ERRORFILES
, NODROP
, CHECKPOINT
, INDICATORS
, DATAENCRYPTION
사양은 변환에 필요하지 않으므로 설명이 생략되었습니다.
Teradata (FastLoad)
BEGIN LOADING FastTable ERRORFILES Error1,Error2
CHECKPOINT 10000;
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()
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
);
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()
내부적으로 import_file_to_table
함수는 임시 스테이지를 생성하고 해당 스테이지에 로컬 파일을 넣어 지정된 테이블에 로딩합니다. 그러나 파일이 이미 Snowflake 에서 지원하는 클라우드 공급자에 저장되어 있을 수 있습니다.
Stage | Input Data Place Holder |
---|---|
Stage | Input Data Place Holder |
Internal stage | @my_int_stage |
External stage | @my_int_stage/path/file.csv |
Amazon S3 bucket | s3://mybucket/data/files |
Google Cloud Storage | gcs://mybucket/data/files |
Microsoft Azure | azure://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")
END LOADING¶
END LOADING
명령은 BEGIN LOADING
의 변환에 필요하지 않으므로 설명이 생략되었습니다.
Teradata (FastLoad)
END LOADING;
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()
Known Issues¶
1. BINARY 및 TEXT 키워드 사양은 지원되지 않습니다
SET RECORD
명령에 대한 BINARY
및 TEXT
키워드 사양은 아직 지원되지 않습니다.
2. VARTEXT 의 기본 사양만 지원됩니다
TRIM
또는 QUOTE
등의 추가 사양(SET RECORD VARTEXT
)은 아직 지원되지 않습니다.
관련 EWIs¶
SSC-FDM-0007: 종속성이 누락된 요소.
SSC-FDM-0027: next 문을 제거했으며 SnowFlake 에서 적용되지 않습니다.
SSC-EWI-0021: 지원되지 않습니다.
SSC-FDM-TD0022: 셸 변수가 발견되어 셸 스크립트에서 이 코드를 실행해야 합니다.