我一直在使用梅蒂斯包通过R运行雅典娜查询,虽然这对于小型查询很好,但是对于具有非常大的返回数据集(例如,10行的数千行)的查询,似乎还没有一个可行的解决方案。但是,在AWS控制台中运行这些相同的查询时,使用下载链接获取查询结果的CSV文件是快速/简单的。
这让我想到:是否有一种机制可以通过R发送查询,但返回/获取查询结果所在的S3://
桶位置,而不是普通的结果对象?
发布于 2019-11-28 11:50:33
正如我在上面的评论中提到的,您可以研究RAthena
和noctua
包。
这些包使用AWS作为驱动程序连接到AWS雅典娜。这意味着他们还将以@Zerodf提到的类似方法从S3下载数据。它们都使用data.table将数据加载到R中,因此它们非常快速。此外,如果出于某种原因需要,您也可以查询执行ID。
下面是如何使用包的示例:
RAthena
创建与AWS雅典娜的连接,有关如何连接的更多信息,请参见: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雅典娜的连接,有关如何连接的更多信息,请参见: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来执行相同的过程。
发布于 2018-06-12 05:20:03
你可以看看Cloudyr项目。它们有一个套餐,它处理为AWS创建签名请求。然后,您可以启动一个查询,轮询AWS,直到查询完成(使用QueryExecutionID),并使用aws.s3下载结果集。
您还可以使用系统()使用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
https://stackoverflow.com/questions/50806014
复制