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
翻訳済みコード
## 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データベースの複数のテーブルとビューを高速かつ大量にメンテナンスするためのコマンド駆動型ユーティリティです。
SnowflakeでTeradataの MultiLoad 機能をシミュレートするために、 BTEQ および FastLoad スクリプトの変換と同様に、 MultiLoad ファイルとコマンドをPythonコードに変換します。生成されたコードでは、snowconvert.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までメールでお問い合わせください。
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 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()
大容量の例¶
上に示した様々なコマンドの変換を踏まえて、次の例を考えてみましょう。
この入力データで:
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 |
既知の問題¶
1.Deleteステートメントは部分的にサポートされています
LAYOUT
で定義された列を指している場合、where条件が見つかると正しく変換されないため、DELETE
ステートメントは部分的にサポートされています。
以下の例では、 :EmpNo
は LAYOUT
で定義された列を指しています。ただし、変換ではこの点が考慮されないため、コードは存在しない列を参照することになります。
exec("""
DELETE FROM
Employee
WHERE
EmpNo = :EmpNo
""")
このドキュメントに関するその他のご質問は、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);
出力¶
以下のような出力が得られるはずです。
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でのパッケージのインストールに慣れていない場合は、以下の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が実行され、そのいずれかが--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')
.....
あるいは、以下のように、関数呼び出しの中で、名前付きパラメーターを任意の順番でセットすることもできます。
.....
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
名前付きパラメーター¶
次のように、コマンドラインで任意の順序で名前付きパラメーターをセットできます(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
環境変数¶
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 (パッケージ)をクリックすると、次のようなものが表示されます。
モジュールヘルパーをクリックすると、以下のような画面が表示されます。
そして、モジュールの関数とクラスをスクロールすることができます。
既知の問題¶
問題は見つかりませんでした。
関連 EWIs ¶
関連 EWIs はありません。
技術ドキュメント¶
関数¶
プロジェクトで定義されたすべての関数。
access¶
**`access`**`(path, mode, *, dir_fd=None, effective_ids=False, follow_symlinks=True)`
説明:¶
パスへのアクセスをテストするには、実際の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`**`()`
説明:¶
スクリプトの実行終了時に実行します。
colored¶
**`colored`**`(text, color='blue')`
説明:¶
指定された色からカラーテキストを印刷します。
パラメーター:¶
テキスト
、
印刷されるテキスト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
、
実行する文字列を含むSQLcon
、
使用する接続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の場合、エスケープされた変数参照(つまり、先頭にバックスラッシュが付くもの)はすべてスキップされます。不明な変数は「デフォルト」にセットされます。「デフォルト」がNoneの場合、それらは変更されません。
パラメーター:
パス
、
params
、
skip_escaped=False
、
FAST LOAD¶
**`fast_load`**`(target_schema, filepath, stagename, target_table_name, con=None)`
説明:¶
渡されたパラメーター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)`
説明:¶
パラメーター:
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¶
**`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)
説明:¶
与えられたファイル名の行を読み、オプションでファイルの先頭のいくつかの行をスキップします。
パラメーター:
line、
読み込むファイル名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、filepath、stagename、ターゲットテーブル名で単純な高速ロードを実行します。
パラメーター:
arg、
使用する接続target_schema、
高速ロードで使用するスキーマの名前filepath、
テーブルにロードされるファイル名のパスtarget_table_name、
データがロードされるテーブル名
stat¶
**`stat`**`(path, *, dir_fd=None, follow_symlinks=True)`
説明:¶
_与えられたパスで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)`
説明:¶
サブシェルでコマンドを実行します。
パラメーター:
_
コマンド
_、
using¶
**`using`**`(*argv)`
説明:¶
パラメーター:
_
*argv
_、
クラス¶
プロジェクトで定義されたすべてのクラス
BeginLoading クラス¶
このクラスは import_file_to_tab
静的関数を含んでおり、 BEGIN LOADING と FastLoad の関連コマンドのサポートを提供します。
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
使用する接続
エクスポートクラス¶
クラスの静的メソッド
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(): |
|
.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
_ の呼び出しがあることに注目してください。この関数はステートメントが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);
これは次のように変換されます。
#*** 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
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()
snowconvert.helpers.readrun("sampfile")
は SAMPFILE から各行を返し、FOR
ステートメントでは、各行が eval
関数に渡されます。これは渡された式を解析し、プログラム内でPython式を実行するメソッドです(SAMPFILE は動作するように変換する必要があります)。
SQL ファイルの実行¶
BTEQ ファイルの実行中に、 SQL ファイルが見つかることがあります。例えば、 NEWSQL という SQL ファイルがあるとします。
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 ファイルから各行を読み込み、セクション クエリステートメントの実行で説明されているようにexec関数を使用します。
既知の問題¶
問題は見つかりませんでした。
関連 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
ステートメントで使用される1つ以上の変数パラメーター名を定義し、データをインポートまたはエクスポートします。
このステートメントの構文は以下の通りです。
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 |
既知の問題¶
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 |
コメント済み |
|
変換済み |
関連する 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()
大容量の例¶
上に示した様々なコマンドの変換を踏まえて、次の例を考えてみましょう。
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までメールでお問い合わせください。
既知の問題¶
問題は見つかりませんでした。
関連 EWIs¶
SSC-FDM-0007: 依存関係のない要素。
SSC-FDM-0027: 次のステートメントを削除しました。 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
コマンドの変換では、 ssc_define_columns
と ssc_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;
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¶
変換に関連する情報は、関連する INSERT
ステートメントにあるので、BEGIN LOADING
コマンドはコメントアウトされています。
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¶
BEGIN LOADING
の変換には必要ないため、END 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()
既知の問題¶
1.BINARY および TEXT キーワード指定はサポートされていません
SET RECORD
コマンドの BINARY
および TEXT
キーワード指定はまだサポートされていません。
2.VARTEXT の基本仕様のみサポートされています
TRIM
や QUOTE
のような SET RECORD VARTEXT
の追加仕様はまだサポートされていません。
関連 EWIs¶
SSC-FDM-0007: 依存関係のない要素。
SSC-FDM-0027: 次のステートメントを削除しました。 SnowFlake には適用されません。
SSC-EWI-0021: サポートされていません。
SSC-FDM-TD0022: シェル変数が見つかりました。このコードをシェルスクリプトで実行する必要があります。