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

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

Windows 7 に Python 2.7.0 と Teradata モジュールをインストールしました。Python から TD に接続してクエリを実行することができません。

pip install Teradata

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

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

私は Python 初心者で、Teradata に接続するための情報がないので、同じコードの記述を手伝ってください。

ベストアンサー1

Teradata に接続してテーブルを Pandas にエクスポートする方法はいくつかあります。以下に 4 つ以上の方法を示します。

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 to install teradata odbc 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

TeradataSQL の使用

@ymzkala より: このパッケージでは、Teradata ドライバー (このパッケージ以外) をインストールする必要はありません。

# Installing python -m pip install teradatasql

import teradatasql

with teradatasql.connect(host='host', user='username', password='password') as connect:
    df = pd.read_sql(query, connect)

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)

5つ目の方法は、キリンモジュールこのモジュールには MLOAD、FASTLOAD、BULKEXPORT などが付属しているので、私は使用して楽しんでいます。初心者にとって唯一の問題は、その要件 (C/C++ コンパイラ、Teradata CLIv2、TPT API ヘッダー/ライブラリ ファイルなど) です。

注: 2018 年 7 月 13 日に更新されました。コンテキスト マネージャーを使用してセッションを確実に閉じるようになりました。

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

df から Teradata にデータを送信できます。 'odbc' の 1 MB 制限と odbc ドライバーの依存性を回避するには、 'rest' メソッドを使用します。 ドライバー引数の代わりに、ホストの ip_address が必要です。注意: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] Memory allocation error"エラーを回避するために、データを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)

おすすめ記事