Access and Query Amazon Athena via DBI/JDBC
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

208 рядки
4.6 KiB

5 роки тому
structure(
0:6,
5 роки тому
.Names = c(
"OFF", "FATAL", "ERROR", "WARNING", "INFO", "DEBUG", "TRACE"
)
)-> .ll_trans
7 роки тому
#' AthenaJDBC
#'
#' @export
6 роки тому
setClass(
"AthenaDriver",
6 роки тому
representation(
"JDBCDriver",
identifier.quote = "character",
jdrv = "jobjRef"
)
6 роки тому
)
7 роки тому
#' AthenaJDBC
#'
#' @export
6 роки тому
Athena <- function(identifier.quote = '`') {
6 роки тому
6 роки тому
JDBC(
driverClass = "com.simba.athena.jdbc.Driver",
5 роки тому
system.file("java", "AthenaJDBC42_2.0.6.jar", package = "metis.lite"),
6 роки тому
identifier.quote = identifier.quote
) -> drv
6 роки тому
7 роки тому
return(as(drv, "AthenaDriver"))
6 роки тому
7 роки тому
}
#' AthenaJDBC
#'
6 роки тому
#' @param provider JDBC auth provider (ideally leave default)
#' @param region AWS region the Athena tables are in
#' @param s3_staging_dir A write-able bucket on S3 that you have permissions for
#' @param schema_name LOL if only this actually worked with Amazon's hacked Presto driver
#' @param max_error_retries,connection_timeout,socket_timeout
6 роки тому
#' technical connection info that you should only muck with if you know what you're doing.
#' @param log_path,log_level The Athena JDBC driver can (shockingly) provide a decent bit
#' of data in logs. Set this to a temporary directory or something log4j can use. For
#' `log_level` use the names ("INFO", "DEBUG", "WARN", "ERROR", "ALL", "OFF", "FATAL", "TRACE") or
#' their corresponding integer values 0-6.
6 роки тому
#' @param ... unused
#' @references <https://docs.aws.amazon.com/athena/latest/ug/connect-with-jdbc.html>
7 роки тому
#' @export
setMethod(
"dbConnect",
"AthenaDriver",
def = function(
drv,
provider = "com.simba.athena.amazonaws.auth.DefaultAWSCredentialsProviderChain",
region = "us-east-1",
s3_staging_dir = Sys.getenv("AWS_S3_STAGING_DIR"),
schema_name = "default",
max_error_retries = 10,
connection_timeout = 10000,
socket_timeout = 10000,
5 роки тому
log_path = "",
log_level = 0,
...) {
7 роки тому
6 роки тому
conn_string = sprintf(
'jdbc:awsathena://athena.%s.amazonaws.com:443/%s', region, schema_name
)
7 роки тому
if (!(log_level %in% 0:6)) log_level <- .ll_trans[log_level]
6 роки тому
callNextMethod(
drv,
conn_string,
S3OutputLocation = s3_staging_dir,
Schema = schema_name,
MaxErrorRetry = max_error_retries,
ConnectTimeout = connection_timeout,
SocketTimeout = socket_timeout,
LogPath = log_path,
LogLevel = log_level,
AwsCredentialsProviderClass = provider,
6 роки тому
...
) -> jc
7 роки тому
7 роки тому
return(as(jc, "AthenaConnection"))
}
)
#' AthenaJDBC
#'
#' @export
setClass("AthenaConnection", contains = "JDBCConnection")
#' AthenaJDBC
#'
#' @export
setClass("AthenaResult", contains = "JDBCResult")
#' AthenaJDBC
#'
6 роки тому
#' @param conn Athena connection
#' @param statement SQL statement
#' @param ... unused
7 роки тому
#' @export
setMethod(
"dbSendQuery",
6 роки тому
signature(conn="AthenaConnection", statement="character"),
7 роки тому
6 роки тому
definition = function(conn, statement, ...) {
7 роки тому
return(as(callNextMethod(), "AthenaResult"))
}
)
#' AthenaJDBC
#'
6 роки тому
#' @param conn Athena connection
#' @param pattern table name pattern
#' @param schema Athena schema name
#' @param ... unused
#' @export
setMethod(
"dbListTables",
signature(conn="AthenaConnection"),
6 роки тому
definition = function(conn, pattern='*', schema, ...) {
6 роки тому
if (missing(pattern)) {
dbGetQuery(
conn, sprintf("SHOW TABLES IN %s", schema)
) -> x
} else {
dbGetQuery(
conn, sprintf("SHOW TABLES IN %s %s", schema, dbQuoteString(conn, pattern))
) -> x
}
x$tab_name
}
)
#' AthenaJDBC
#'
#' @param conn Athena connection
#' @param name table name
#' @param schema Athena schema name
#' @param ... unused
#' @export
setMethod(
"dbExistsTable",
signature(conn="AthenaConnection", name="character"),
6 роки тому
definition = function(conn, name, schema, ...) {
6 роки тому
length(dbListTables(conn, schema=schema, pattern=name)) > 0
}
)
#' AthenaJDBC
#'
#' @param conn Athena connection
#' @param name table name
#' @param schema Athena schema name
#' @param ... unused
#' @export
setMethod(
"dbListFields",
signature(conn="AthenaConnection", name="character"),
6 роки тому
definition = function(conn, name, schema, ...) {
6 роки тому
query <- sprintf("SELECT * FROM %s.%s LIMIT 1", schema, name)
res <- dbGetQuery(conn, query)
colnames(res)
}
)
#' AthenaJDBC
#'
#' @param conn Athena connection
#' @param name table name
#' @param schema Athena schema name
#' @param ... unused
#' @export
setMethod(
"dbReadTable",
signature(conn="AthenaConnection", name="character"),
6 роки тому
definition = function(conn, name, schema, ...) {
6 роки тому
query <- sprintf("SELECT * FROM %s.%s LIMIT 1", schema, dbQuoteString(conn, name))
dbGetQuery(conn, query)
7 роки тому
}
)