有多种方法可以连接到 Teradata 并将表导出到 Pandas。这里有四个+:
# 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
来自@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)
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)
#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 module。我喜欢使用这个模块,因为它带有 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,而不是驱动程序参数。 注意: 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”,您必须将数据分块为小于 1MB 的块,以避免出现“[HY001][Teradata][ODBC Teradata Driver] Memory allocation error”错误:例如
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)