【问题标题】:Can you use Athena ODBC/JDBC to return the S3 location of results?您可以使用 Athena ODBC/JDBC 返回结果的 S3 位置吗?
【发布时间】:2023-04-02 06:20:01
【问题描述】:

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

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

【问题讨论】:

标签: r amazon-athena


【解决方案1】:

正如我在上面的评论中提到的,您可以调查RAthenanoctua 包。

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

以下是如何使用这些包的示例:

RAthena

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

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

如何查询 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())

如何查询 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 来执行相同的过程。

【讨论】:

    【解决方案2】:

    您可以查看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

    【讨论】:

    • 感谢@zerodf。这很棒。我的想法解决方案将在 JDBC 驱动程序的上下文中,所以让我再给它一两天看看是否会弹出这样的答案。否则我会接受这个答案。
    • 这个概念用在包RAthenanoctua中。这些包使用 python 的 Boto3 和 R paws SDK 进入亚马逊,以创建一个进入 Athena 的 DBI 接口。如果您希望在这些包中显示 Athena 查询 ID,请在链接的 github 上提出问题票。
    猜你喜欢
    • 2010-10-31
    • 2014-08-26
    • 1970-01-01
    • 2020-06-18
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    相关资源
    最近更新 更多