【问题标题】:How can I get the full result when querying AWS Athena through the paws package in R?通过 R 中的 paws 包查询 AWS Athena 时如何获得完整结果?
【发布时间】:2021-08-14 03:26:51
【问题描述】:

我一直在尝试通过 paws 包从 Athena 获取数据到 R 中。到目前为止,我已经成功地让查询运行并返回了一些结果。但我得到的默认最大值为 1000。我已经看到了一些 Python 中 Boto3 库的解决方案,但即使语法相似,我也可以调用像 Boto3 那样的分页函数。

有人知道如何进行分页,或者如何使用函数的下一个标记参数吗?

这是我的代码的样子:

用于连接 AWS 服务的 SDK

install.packages('paws')
install.packages('tidyverse')

创建一个 Athena 对象:

athena <- paws::athena()

编写查询并指定输出位置:

query <- athena$start_query_execution(QueryString = '
                                                    SELECT *
                                                    FROM db.table
                                                    LIMIT 100000
                                                    ',
                                       ResultConfiguration = list(OutputLocation =
                                                                  "s3://aws-athena..."
                                                                  )
                                      )

执行查询

result <- athena$get_query_execution(QueryExecutionId = query$QueryExecutionId)

获取查询输出:

output <- athena$get_query_results(QueryExecutionId = query$QueryExecutionId)

解析成表格对象

data <- dplyr::as_tibble(t(matrix(unlist(output$ResultSet$Rows),nrow = length(unlist(output$ResultSet$Rows[1])))))

colnames(data) <- as.character(unlist(data[1, ]))
data <- data[-1, ]

【问题讨论】:

    标签: r amazon-web-services aws-sdk amazon-athena


    【解决方案1】:

    您可能需要考虑noctua 包。这个包使用 paws SDK(DBI 接口)将 R 连接到 Athena。它解决了您遇到的 1000 行限制的问题。所以你上面的查询看起来像:

    library(DBI)
    
    con = dbConnect(noctua::athena(), s3_staging_dir = "s3://aws-athena...")
    
    dbGetQuery(con, "SELECT * FROM db.table LIMIT 100000")
    

    该软件包还提供与dplyr 的集成:

    library(DBI)
    library(dplyr)
    
    con = dbConnect(noctua::athena(), 
                    schema_name = "db", 
                    s3_staging_dir = "s3://aws-athena...")
    
    tbl(con, "table"))
    

    【讨论】:

    • 谢谢,成功了!我确实有一个保留,它适用于 100K 行,但是当我尝试 1MIL 或更高时,我得到并限制异常。我想需要一些背景知识,我试图在 AWS Sagemaker 中运行我的代码。因此,为了获取更多数据,我应该创建一个更大的实例,还是需要在帐户管理方面完成一些事情?对此的任何帮助将不胜感激。
    • 我最初的猜测是仔细检查 sagemaker 实例的大小,因为它可能会最大化你的 ram。如果不是这样,您可以通过以下方式提出票证:github.com/DyfanJones/noctua/issues。这将有助于确定在传输大数据时是否是 paws sdk 的问题。或者,您可以尝试 RAthena,它与 noctua 完全相同,但它使用 boto3 代替连接。最后,如果这是一个 ram 问题,请提出大于内存查询的功能请求,我是 noctua 的作者,很高兴研究为该包开发进一步的改进
    • 太棒了,如果需要,我会调查一下并提出请求。感谢您的帮助!
    【解决方案2】:

    这已经晚了,但它确实回答了原始帖子。您可以使用get_query_results() 中的NextToken 属性从查询中获取所有结果。我没有对它进行基准测试,但在简单的示例中注意到它更快,因为它没有以使用dbConnect()RAthena::athena()noctura::athena() 的方式建立与整个雅典娜“数据库”的连接。以下循环会将您的所有查询结果放入您的 tibble:

    # starting with the OP results processing 
    output <- athena$get_query_results(QueryExecutionId = query$QueryExecutionId)
    
    data <- dplyr::as_tibble(t(matrix(unlist(output$ResultSet$Rows),
                                      nrow = length(unlist(output$ResultSet$Rows[1])))))
    
    colnames(data) <- as.character(unlist(data[1, ]))
    data <- data[-1, ]
    
    # adding this loop will get the rest of your query results
    while(length(output$NextToken) == 1) {
      output <- athena$get_query_results(QueryExecutionId = query$QueryExecutionId,
                                         NextToken = output$NextToken)
      tmp <- dplyr::as_tibble(t(matrix(unlist(output$ResultSet$Rows),
                                       nrow = length(unlist(output$ResultSet$Rows[1])))))
      colnames(tmp) <- colnames(data)
      data <- rbind(data, tmp)
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-28
      • 2021-12-14
      • 2019-03-22
      • 2018-12-17
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      相关资源
      最近更新 更多