web-dev-qa-db-ja.com

Teradataモジュールを使用してTeradataとPythonを接続する

Windows 7にpython 2.7.0およびTeradataモジュールをインストールしました。pythonからTDに接続してクエリを実行できません。

pip install Teradata

次に、ソースコードにteradataモジュールをインポートし、次のような操作を実行します。

  1. Teradataへのクエリの実行と結果セットの取得。
  2. Teradataに接続されているかどうかを確認します。

Pythonが初めてで、テラデータに接続するための情報がありません。

10
anurag

Teradataに接続し、テーブルをPandasにエクスポートする方法はいくつかあります。 3つあります。

teradataモジュールを使用

# You can install teradata via PIP: pip install teradata
# to get a list of your odbc drivers names, you could do: teradata.tdodbc.drivers
# You don’t need of coffee driver if using method='rest'.     
# See sending data from df to teradata for connection example 

import teradata
import pandas as pd

Host,username,password = 'Host','UID', 'PWD'
#Make a connection
udaExec = teradata.UdaExec (appName="test", version="1.0", logConsole=False)


with udaExec.connect(method="odbc",system=Host, username=username,
                            password=password, driver="DRIVERNAME") as connect:

    query = "SELECT * FROM DATABASEX.TABLENAMEX;"

    #Reading query to df
    df = pd.read_sql(query,connect)
    # do something with df,e.g.
    print(df.head()) #to see the first 5 rows

pyodbcモジュールを使用

import pyodbc

 #You can install teradata via PIP: pip install pyodbc
 #to get a list of your odbc drivers names, you could do: pyodbc.drivers()

#Make a connection
link = 'DRIVER={DRIVERNAME};DBCNAME={hostname};UID={uid};PWD={pwd}'.format(
                      DRIVERNAME=DRIVERNAME,hostname=hostname,  
                      uid=username, pwd=password)
with pyodbc.connect(link,autocommit=True) as connect:

    #Reading query to df
    df = pd.read_sql(query,connect)

sqlalchemyモジュール の使用

 #You can install sqlalchemy via PIP: pip install sqlalchemy-teradata
 #Note: It is not pip install sqlalchemy. If you already have sqlalchemy, you still need sqlalchemy-teradata to get teradata dialects

from sqlalchemy import create_engine

#Make a connection

link = 'teradata://{username}:{password}@{hostname}/?driver={DRIVERNAME}'.format(
               username=username,hostname=hostname,DRIVERNAME=DRIVERNAME)

with create_engine(link) as connect:

    #Reading query to df
    df = pd.read_sql(query,connect)

giraffezモジュール を使用する4番目の方法があります。 MLOAD、FASTLOAD、BULKEXPORTなどに付属しているこのモジュールの使用を楽しんでいます。初心者向けの唯一の問題は、その要件(C/C++コンパイラ、Teradata CLIv2、TPT APIヘッダー/ libファイルなど)です。

注:セッションの終了を保証するためにコンテキストマネージャーを使用して、2018年7月13日に更新

更新:31-10-2018:teradataを使用してdfからteradataにデータを送信する

DfからTeradataにデータを送信できます。 「odbc」1 MBの制限とodbcドライバーの依存関係を回避するために、「rest」メソッドを使用できます。ドライバ引数の代わりに、ホストip_addressが必要です。 NB:dfの列の順序は、Teradataテーブルの列の順序と一致する必要があります。

import teradata
import pandas as pd

# Host_IP can be found by executing *>>nslookup viewpoint* or *ping  viewpoint* 
udaExec = teradata.UdaExec (appName="test", version="1.0", logConsole=False) 
with udaExec.connect(method="rest",system="DBName", username="UserName",
                      password="Password", Host="Host_IP_ADDRESS") as connect:

    data = [Tuple(x) for x in df.to_records(index=False)]

    connect.executemany("INSERT INTO DATABASE.TABLEWITH5COL") 
                values(?,?,?,?,?)",data,batch=True)

「odbc」を使用すると、「[HY001] [Teradata] [ODBC Teradata Driver]メモリ割り当てエラー」エラーを回避するために、データを1MB未満のチャンクにチャンクする必要があります。

import teradata
import pandas as pd
import numpy as np

udaExec = teradata.UdaExec (appName="test", version="1.0", logConsole=False)

with udaExec.connect(method="odbc",system="DBName", username="UserName",
                      password="Password", driver="DriverName") as connect:

    #We can divide our huge_df to small chuncks. E.g. 100 churchs
    chunks_df = np.array_split(huge_df, 100)

    #Import chuncks to Teradata
    for i,_ in enumerate(chunks_df):

        data = [Tuple(x) for x in chuncks_df[i].to_records(index=False)]
        connect.executemany("INSERT INTO DATABASE.TABLEWITH5COL values(?,?,?,?,?)",data,batch=True)
18

Teradata Pythonモジュールおよびpython pyodbc.pydをインターネットからダウンロードします。cmdinstall setup.pyを使用してインストールします。

次に、テラデータに接続してデータを抽出するためのサンプルスクリプトを示します。

import teradata
import pyodbc
import sys



udaExec = teradata.UdaExec (appName="HelloWorld", version="1.0",
        logConsole=False)

session = udaExec.connect(method="odbc", dsn="prod32",
        username="PRODRUN", password="PRODRUN");

i = 0
REJECTED = 'R';

f = file("output.txt","w");sys.stdout=f

cursor =  session.cursor();

ff_remaining = 0;

cnt = cursor.execute("SELECT  SEQ_NO,FRQFBKDC,PNR_RELOC FROM ttemp.ffremaining ORDER BY 1,2,3 ").rowcount;
rows = cursor.execute("SELECT  SEQ_NO,FRQFBKDC,PNR_RELOC FROM ttemp.ffremaining ORDER BY 1,2,3 ").fetchall();


for i in range(cnt):
    ff_remaining = cursor.execute("select count(*) as coun from  ttemp.ffretroq_paxoff where seq_no=? and status <> ?",(rows[i].seq_no,REJECTED)).fetchall();
    print ff_remaining[0].coun, rows[i].seq_no, REJECTED;

Prayson's answerに追加するには、teradatasqlパッケージを使用できます( found on pypi )。このパッケージでは、Teradataドライバー(このパッケージ以外)をインストールする必要はありません。次のように使用します。

import teradatasql
import pandas as pd

with teradatasql.connect(Host='Host', user='username', password='password') as connect:
    data = pd.read_sql('select top 5 * from table_name;', connect)

0
ymzkala