我可以使用 DBI 写入 s3 上的 Athena table 吗?
Can I write to a Athena table on s3 using DBI?
我有一个到 Athena 的 odbc 连接,并且已经能够读取和检索数据。例如,我在配置单元中创建了一个新的空 table,它使用与 Athena 的 s3 相同的元存储:
CREATE EXTERNAL TABLE IF NOT EXISTS adhoc.mtcars
(
mpg integer,
cyl integer,
disp integer,
hp integer,
drat integer,
wt integer,
qsec integer,
vs integer,
am integer,
gear integer,
carb integer)
partitioned by (year string, month string, day string)
stored as orc
location 's3://ourco-emr/tables/adhoc.db/mtcars';
我可以使用 DBI::dbReadTable:
读取这个新的空白 table
con <- dbConnect(odbc(), "Athena")
dbReadTable(con, DBI::Id(schema = "adhoc", table = "mtcars"))
Returns:
[1] mpg cyl disp hp drat wt qsec vs am gear carb year month day
<0 rows> (or 0-length row.names)
因此,空 table 清晰可见。
注意上面的配置单元创建table:
location 's3://ourco-emr/tables/adhoc.db/mtcars'
此 table 的数据应存储在该位置的 s3 中。
我尝试使用 dbWriteTable 将 mtcars 写入此位置:
dbWriteTable(conn = con,
name = "tables/adhoc.db/mtcars",
value = mtcars,
overwrite = FALSE,
append = TRUE,
file.type = "orc",
partition = c(year = "2020", month = "02", day = "01"),
s3.location = "s3://ourco-emr/tables/adhoc.db/mtcars/mtcars")
这似乎 运行 几秒钟后返回此错误消息:
Error: nanodbc/nanodbc.cpp:1617: 00000: [Simba][Athena] (1040) An error has been thrown from the AWS Athena client. Athena Error No: 130, HTTP Response Code: 400, Exception Name: InvalidRequestException, Error Message: line 1:14: no viable alternative at input 'CREATE TABLE "tables/adhoc.db/mtcars"' [Execution ID: ]
'CREATE TABLE "tables/adhoc.db/mtcars" (
"row_names" VARCHAR(255),
"mpg" DOUBLE PRECISION,
"cyl" DOUBLE PRECISION,
"disp" DOUBLE PRECISION,
"hp" DOUBLE PRECISION,
"drat" DOUBLE PRECISION,
"wt" DOUBLE PRECISION,
"qsec" DOUBLE PRECISION,
"vs" DOUBLE PRECISION,
"am" DOUBLE PRECISION,
"gear" DOUBLE PRECISION,
"carb" DOUBLE PRECISION
)
看起来 dbi 正在尝试创建一个新的 table,我只想在其中追加到现有的,尽管我之前创建的是空的。
如何使用 DBI 将数据帧发送到 s3?
我无法对 odbc
发表评论,但是有两个包 RAthena
and noctua
具有 DBI
方法用于将数据上传到 AWS Athena。
RAthena
利用 Python SDK boto3
创建到 AWS 的连接。 noctua
利用 R SDK paws
创建到 AWS 的连接。
library(DBI)
# connect to AWS Athena using RAthena
con = dbConnect(RAthena::athena())
# OR connect to AWS Athena using noctua
con = dbConnect(noctua::athena())
# Uploading to existing AWS Athena table
dbWriteTable(conn = con,
name = "adhoc.mtcars",
value = mtcars,
append = TRUE,
file.type = "parquet",
partition = c(year = "2020", month = "02", day = "01"),
s3.location = "s3://ourco-emr/tables/")
dbGetQuery(con, "select * from adhoc.iris")
目前这些包只支持 file.types
["tsv", "csv", "parquet"] 上传到 AWS Athena。要扩展当前包的功能,请在以下位置提出功能请求:https://github.com/DyfanJones/RAthena/issues and https://github.com/DyfanJones/noctua/issues.
注意: 不要在相同的环境中加载两个包,因为连接 类 会发生冲突。
我有一个到 Athena 的 odbc 连接,并且已经能够读取和检索数据。例如,我在配置单元中创建了一个新的空 table,它使用与 Athena 的 s3 相同的元存储:
CREATE EXTERNAL TABLE IF NOT EXISTS adhoc.mtcars
(
mpg integer,
cyl integer,
disp integer,
hp integer,
drat integer,
wt integer,
qsec integer,
vs integer,
am integer,
gear integer,
carb integer)
partitioned by (year string, month string, day string)
stored as orc
location 's3://ourco-emr/tables/adhoc.db/mtcars';
我可以使用 DBI::dbReadTable:
读取这个新的空白 tablecon <- dbConnect(odbc(), "Athena")
dbReadTable(con, DBI::Id(schema = "adhoc", table = "mtcars"))
Returns:
[1] mpg cyl disp hp drat wt qsec vs am gear carb year month day
<0 rows> (or 0-length row.names)
因此,空 table 清晰可见。
注意上面的配置单元创建table:
location 's3://ourco-emr/tables/adhoc.db/mtcars'
此 table 的数据应存储在该位置的 s3 中。
我尝试使用 dbWriteTable 将 mtcars 写入此位置:
dbWriteTable(conn = con,
name = "tables/adhoc.db/mtcars",
value = mtcars,
overwrite = FALSE,
append = TRUE,
file.type = "orc",
partition = c(year = "2020", month = "02", day = "01"),
s3.location = "s3://ourco-emr/tables/adhoc.db/mtcars/mtcars")
这似乎 运行 几秒钟后返回此错误消息:
Error: nanodbc/nanodbc.cpp:1617: 00000: [Simba][Athena] (1040) An error has been thrown from the AWS Athena client. Athena Error No: 130, HTTP Response Code: 400, Exception Name: InvalidRequestException, Error Message: line 1:14: no viable alternative at input 'CREATE TABLE "tables/adhoc.db/mtcars"' [Execution ID: ] 'CREATE TABLE "tables/adhoc.db/mtcars" ( "row_names" VARCHAR(255), "mpg" DOUBLE PRECISION, "cyl" DOUBLE PRECISION, "disp" DOUBLE PRECISION, "hp" DOUBLE PRECISION, "drat" DOUBLE PRECISION, "wt" DOUBLE PRECISION, "qsec" DOUBLE PRECISION, "vs" DOUBLE PRECISION, "am" DOUBLE PRECISION, "gear" DOUBLE PRECISION, "carb" DOUBLE PRECISION )
看起来 dbi 正在尝试创建一个新的 table,我只想在其中追加到现有的,尽管我之前创建的是空的。
如何使用 DBI 将数据帧发送到 s3?
我无法对 odbc
发表评论,但是有两个包 RAthena
and noctua
具有 DBI
方法用于将数据上传到 AWS Athena。
RAthena
利用 Python SDK boto3
创建到 AWS 的连接。 noctua
利用 R SDK paws
创建到 AWS 的连接。
library(DBI)
# connect to AWS Athena using RAthena
con = dbConnect(RAthena::athena())
# OR connect to AWS Athena using noctua
con = dbConnect(noctua::athena())
# Uploading to existing AWS Athena table
dbWriteTable(conn = con,
name = "adhoc.mtcars",
value = mtcars,
append = TRUE,
file.type = "parquet",
partition = c(year = "2020", month = "02", day = "01"),
s3.location = "s3://ourco-emr/tables/")
dbGetQuery(con, "select * from adhoc.iris")
目前这些包只支持 file.types
["tsv", "csv", "parquet"] 上传到 AWS Athena。要扩展当前包的功能,请在以下位置提出功能请求:https://github.com/DyfanJones/RAthena/issues and https://github.com/DyfanJones/noctua/issues.
注意: 不要在相同的环境中加载两个包,因为连接 类 会发生冲突。