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

Can you use Athena ODBC/JDBC to return the S3 location of results?

我一直在使用 metis 包通过 R 进行 运行 Athena 查询。虽然这对于小型查询非常有用,但似乎仍然没有可行的解决方案来处理非常复杂的查询大型 return 数据集(例如,数千行的 10 行)。但是,当 运行 在 AWS 控制台中执行这些相同的查询时, fast/straightforward 使用下载 link 来获取查询结果的 CSV 文件。

这让我开始思考:是否有一种机制可以通过 R 发送查询,但是 returning/obtaining S3:// 存储查询结果而不是正常结果对象的存储桶位置?

您可以查看 Cloudyr Project. They have a package that handles creating the signature requests for the AWS API. Then you can fire off a query, poll AWS until the query finishes (using the QueryExecutionID), and use aws.s3 下载结果集。

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

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

$ aws athena start-query-execution --query-string "select count(*) from test_null_unquoted" --execution-context Database=Whosebug --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 Whosebug 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

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

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

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

拉西娜

创建与 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 来执行相同的过程。