J'ai installé python 2.7.0 et le module Teradata sur Windows 7. Je ne suis pas en mesure de me connecter et d'interroger TD à partir de python.
pip install Teradata
Maintenant, je veux importer le module de teradata dans mon code source et effectuer des opérations comme -
S'il vous plaît aidez-moi à écrire du code pour la même chose que je suis nouveau à Python et il n'y a aucune information disponible avec moi pour me connecter à teradata.
Il existe plusieurs façons de se connecter à Teradata et d'exporter la table vers Pandas. En voici trois:
# 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
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)
Il existe une quatrième façon, en utilisant module giraffez . J'aime utiliser ce module car il est fourni avec MLOAD, FASTLOAD, BULKEXPORT, etc. Le seul problème pour les débutants est ses exigences (par exemple, compilateur C/C++, Teradata CLIv2 et TPAD API headers/lib files).
Remarque: mise à jour le 13-07-2018, en utilisant le gestionnaire de contexte pour assurer la fermeture des sessions
Mise à jour: 31-10-2018: Utilisation de teradata pour envoyer des données de df à teradata
Nous pouvons envoyer des données de df à Teradata. En évitant la limite de 1 Mo 'odbc' et la dépendance du pilote odbc, nous pouvons utiliser la méthode 'reste'. Nous avons besoin de l'hôte ip_address, au lieu de l'argument du pilote. NB: L'ordre des colonnes dans df doit correspondre à l'ordre des colonnes dans la table 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)
En utilisant 'odbc', vous devez segmenter vos données en moins de 1 Mo pour éviter l'erreur "[HY001] [Teradata] [ODBC Teradata Driver] Memory allocation error": par ex.
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)
Téléchargez le module Teradata Python et python pyodbc.pyd depuis Internet. Installez à l'aide de cmd install setup.py.
Voici l'exemple de script pour se connecter à des données et extraire des données:
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;
Pour ajouter à Prayson's réponse, vous pouvez utiliser le paquet teradatasql ( trouvé sur pypi ). Ce package ne vous oblige pas à installer les pilotes Teradata (autres que ce package). Utilisez-le comme ceci:
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)