RODBC ermöglicht es, von R aus Teradata SQL Anweisungen durchzuführen. Abfrageergebnisse werden als Data Frames repräsentiert und können nahtlos in R weiterverwendet werden.
Zunächst importieren wir das Paket RODBC.
library(RODBC)
Danach öffnen wir eine ODBC Verbindung zum Teradata RDBMS. Die Option USEREGIONALSETTINGS verhindert, daß RODBC – aufgrund der Ländereinstellung Österreich und des damit verbundenen Dezimalkommas – DECIMAL Spalten als Text interpretiert.
td <- odbcDriverConnect(connection="DRIVER=Teradata;DBCNAME=127.0.0.1;DATABASE=theDatabasename;UID=theUsername;PWD=thePassword;USEREGIONALSETTINGS=N")
SQL SELECT Anweisungen werden mit der Funktion sqlQuery() ausgeführt; diese liefert einen Data Frame zurück. Klarerweise achten wir in diesem Schritt auf die zu erwartende Datenmenge.
x<-sqlQuery(td,
"SELECT
tablename AS name
,createtimestamp (DATE) AS createdate
,characters(TRIM(Tablename)) AS namelength
FROM
dbc.tables
WHERE
tablekind='T'
AND createtimestamp IS NOT NULL
AND databasename='theDatabasename'
;")
Zuletzt schließen wir die nicht mehr benötigte Datenbankverbindung.
odbcClose(td)
Der Data Frame steht weiterhin zur Verfügung:
# display the first lines
head(x)
name createdate namelength
1 SPxxxxxxxxxxxxxxxxxxxxxxxxxxxx 2011-11-09 30
2 MCxxxxxxxxxxxxxxxxxxxxxxxxxxx 2013-06-10 29
3 MCxxxxxxxxxxxxxxxxxxxxxxx 2013-03-12 25
4 Inxxxxxxxxxxxxxxxxxxxxx 2002-12-27 23
5 Inxxxxxxxxxxxxxxxxx 2002-02-28 19
6 BFxxxxxxxxxxxxxxxxxxxxxx 2005-03-16 24
# show column information
summary(x)
name createdate namelength
Abxxxxxxx : 1 Min. :2000-05-16 Min. : 3.00
Adxxxxx : 1 1st Qu.:2006-09-04 1st Qu.:14.00
Adxxxxxxxxxxxxxxxxxxxxx : 1 Median :2010-07-02 Median :19.00
Adxxxxxxxxxxx : 1 Mean :2009-05-30 Mean :18.87
Adxxxxxxxxxxxxxx : 1 3rd Qu.:2012-12-12 3rd Qu.:24.00
Agxxxxxxxxxxxxxxxxxx : 1 Max. :2014-02-07 Max. :30.00
(Other) :543
# plot density of table age
tableage=as.numeric(x[,2] - Sys.Date())
plot(density(tableage))
Damit ist die grundsätzliche Vorgangsweise auch schon beschrieben.
Die folgende Abfrage ist hilfreich um zu überprüfen, ob die Datentypumwandlungen zwischen RDBMS, ODBC und R funktionieren:
x<-sqlQuery(td,
"SELECT
-128 (BYTEINT) AS vminByteint
,127 (BYTEINT) AS vmaxByteint
,-32768 (SMALLINT) AS vminSmallint
, 32767 (SMALLINT) AS vmaxSmallint
,-2147483648 (INTEGER) AS vminInteger
, 2147483647 (INTEGER) AS vmaxInteger
,-9223372036854775808 (BIGINT) AS vminBigint
, 9223372036854775807 (BIGINT) AS vmaxBigint
,-9.9 (DECIMAL(2,1)) AS vminDecimal1B
, 9.9 (DECIMAL(2,1)) AS vmaxDecimal1B
,-9.999 (DECIMAL(4,3)) AS vminDecimal2B
, 9.999 (DECIMAL(4,3)) AS vmaxDecimal2B
,-9.99999999 (DECIMAL(9,8)) AS vminDecimal4B
, 9.99999999 (DECIMAL(9,8)) AS vmaxDecimal4B
,-9.99999999999999999 (DECIMAL(18,17)) AS vminDecimal8B
, 9.99999999999999999 (DECIMAL(18,17)) AS vmaxDecimal8B
,-9.9999999999999999999999999999999999999 (DECIMAL(38,37)) AS vminDecimal16B
, 9.9999999999999999999999999999999999999 (DECIMAL(38,37)) AS vmaxDecimal16B
,123.456789 (FLOAT) AS vFloat
,CURRENT_DATE AS vDate
,CURRENT_TIME AS vTime
,CURRENT_TIMESTAMP AS vTimestamp
,'aZöäüÖÄÜß?!*' (VARCHAR(25)) AS vVarchar
,'aZöäüÖÄÜß?!*' (CHAR(25)) AS vChar
;")
Als Merkhilfe einige nützliche RODBC bzw. R Funktionen:
# regarding the ODBC connection ("channel")
odbcGetErrMsg(td)
odbcGetInfo(td)
sqlTypeInfo(td)
# regarding data types ("modes")
class(x)
[1] "data.frame"
mode(x)
[1] "list"
mode(x[,3])
[1] "numeric"