您可以使用Athena ODBC / JDBC返回结果的S3位置吗?

时间:2018-06-11 21:05:38

标签: r amazon-athena

我一直在使用metis软件包通过R运行Athena查询。虽然这对于小型查询非常有用,但对于具有非常大的返回数据集的查询,似乎仍然不可行(例如,数千行的10个。但是,在AWS控制台中运行这些相同的查询时,使用下载链接快速/直接获取查询结果的CSV文件。

这让我想到:是否存在通过R发送查询但返回/获取查询结果的S3://存储桶位置而不是正常结果对象的机制?

2 个答案:

答案 0 :(得分:1)

您可以查看Cloudyr Project。他们有一个package来处理创建AWS API的签名请求。然后,您可以触发查询,轮询AWS直到查询完成(使用QueryExecutionID),并使用aws.s3下载结果集。

您还可以使用system()使用AWS CLI命令执行查询,等待结果并下载结果。

例如:您可以在命令行上运行以下命令以获取查询结果。

$ aws athena start-query-execution --query-string "select count(*) from test_null_unquoted" --execution-context Database=stackoverflow --result-configuration OutputLocation=s3://SOMEBUCKET/ --output text XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

获得query-execution-id后,您可以查看结果。

$ aws athena get-query-execution --query-execution-id=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX --output text QUERYEXECUTION select count(*) from test_null_unquoted XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX QUERYEXECUTIONCONTEXT stackoverflow RESULTCONFIGURATION s3://SOMEBUCKET/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.csv STATISTICS 104 1403 STATUS 1528809056.658 SUCCEEDED 1528809054.945

查询成功后,您可以下载数据。

$ aws s3 cp s3://stack-exchange/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.csv

修改 您甚至可以将这些命令转换为单行(这里是Bash示例),但我确定您可以在powershell中执行相同的操作。

$ eid=`aws athena start-query-execution --query-string "select count(*) from test_null_unquoted" --query-execution-context Database=SOMEDATABASE--result-configuration OutputLocation=s3://SOMEBUCKET/ --output text --output text` && until aws athena get-query-execution --query-execution-id=$eid --output text | grep "SUCCEEDE D"; do sleep 10 | echo "waiting..."; done && aws s3 cp s3://SOMEBUCKET/$eid.csv . && unset eid

答案 1 :(得分:1)

正如我在上面的评论中所述,您可以研究RAthenanoctua软件包。

这些软件包使用AWS开发工具包作为驱动程序连接到AWS Athena。这意味着他们还将以@Zerodf提到的类似方法从S3下载数据。它们都使用data.table将数据加载到R中,因此它们非常快。另外,出于某些原因,您也可以获取查询执行ID。

以下是如何使用软件包的示例:

RAthena

创建与AWS Athena的连接,有关如何进行连接的更多信息,请查看:dbConnect

library(DBI)
con <- dbConnect(RAthena::athena())

有关如何查询雅典娜的示例:

dbGetQuery(con, "select * from sampledb.elb_logs")

如何访问查询ID:

res <- dbSendQuery(con,  "select * from sampledb.elb_logs")

sprintf("%s%s.csv",res@connection@info$s3_staging, res@info$QueryExecutionId)

小憩

创建与AWS Athena的连接,有关如何进行连接的更多信息,请查看:dbConnect

library(DBI)
con <- dbConnect(noctua::athena())

有关如何查询雅典娜的示例:

dbGetQuery(con, "select * from sampledb.elb_logs")

如何访问查询ID:

res <- dbSendQuery(con,  "select * from sampledb.elb_logs")

sprintf("%s%s.csv",res@connection@info$s3_staging, res@info$QueryExecutionId)

总结

这些程序包应该可以满足您的需求,但是它们在s3中从查询输出中下载数据时,我相信您无需转到查询执行ID即可执行相同的过程。