我一直在使用metis软件包通过R运行Athena查询。虽然这对于小型查询非常有用,但对于具有非常大的返回数据集的查询,似乎仍然不可行(例如,数千行的10个。但是,在AWS控制台中运行这些相同的查询时,使用下载链接快速/直接获取查询结果的CSV文件。
这让我想到:是否存在通过R发送查询但返回/获取查询结果的S3://
存储桶位置而不是正常结果对象的机制?
答案 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)
正如我在上面的评论中所述,您可以研究RAthena
和noctua
软件包。
这些软件包使用AWS开发工具包作为驱动程序连接到AWS Athena。这意味着他们还将以@Zerodf提到的类似方法从S3下载数据。它们都使用data.table将数据加载到R中,因此它们非常快。另外,出于某些原因,您也可以获取查询执行ID。
以下是如何使用软件包的示例:
创建与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即可执行相同的过程。