当前位置: 首页 > 知识库问答 >
问题:

我可以使用DBI写到s3上的雅典娜表吗?

苏鸿羽
2023-03-14

我有一个到Athena的odbc连接,并且已经能够读取和检索数据了。例如,我在hive中创建了一个新的空表,它对Athena使用了与s3相同的元存储

CREATE EXTERNAL TABLE IF NOT EXISTS adhoc.mtcars
(
mpg integer,
cyl integer,
disp integer,
hp integer,
drat integer,
wt integer,
qsec integer,
vs integer,
am integer,
gear integer,
carb integer)
partitioned by (year string, month string, day string)
stored as orc
location 's3://ourco-emr/tables/adhoc.db/mtcars';

我可以使用DBI::DbReadTable读取这个新的空表:

con <- dbConnect(odbc(), "Athena")
dbReadTable(con, DBI::Id(schema = "adhoc", table = "mtcars"))

返回:

 [1] mpg   cyl   disp  hp    drat  wt    qsec  vs    am    gear  carb  year  month day  
<0 rows> (or 0-length row.names)
location 's3://ourco-emr/tables/adhoc.db/mtcars'
dbWriteTable(conn = con,
             name = "tables/adhoc.db/mtcars",
             value = mtcars,
             overwrite = FALSE,
             append = TRUE,
             file.type = "orc",
             partition = c(year = "2020", month = "02", day = "01"),
             s3.location =  "s3://ourco-emr/tables/adhoc.db/mtcars/mtcars")

如何使用DBI向s3发送数据帧?

共有1个答案

姜华翰
2023-03-14

我无法评论ODBC,但有两个包RathenaNoctua,它们具有DBI方法,用于将数据上传到AWS雅典娜。

Rathena使用Python SDKBoto3创建到AWS的连接。Noctua使用R SDKpaws创建到AWS的连接。

library(DBI)

# connect to AWS Athena using RAthena
con = dbConnect(RAthena::athena())

# OR connect to AWS Athena using noctua
con = dbConnect(noctua::athena())

# Uploading to existing AWS Athena table
dbWriteTable(conn = con,
             name = "adhoc.mtcars",
             value = mtcars,
             append = TRUE,
             file.type = "parquet",
             partition = c(year = "2020", month = "02", day = "01"),
             s3.location =  "s3://ourco-emr/tables/")

dbGetQuery(con, "select * from adhoc.iris")

目前,这些包在上传到AWS雅典娜时只支持file.types[“tsv”,“csv”,“parquet”]。要扩展当前软件包的功能,请在以下位置提出特性请求:https://github.com/dyfanjones/rathena/issues和https://github.com/dyfanjones/noctua/issues。

 类似资料:
  • 问题内容: Athena查询的结果由S3中的查询ID(一个长字符串)保存。我想知道是否可以使用预先指定的名称保存查询结果?(以后可以轻松查看) 问题答案: 不幸的是,没有(至少现在还没有)!到目前为止,执行此操作的最佳方法是编写脚本以遍历每次运行的所有结果,然后重命名(移动+删除)该s3存储桶中的所有文件!

  • 问题内容: 我正在尝试创建以下视图: 它给了我以下错误: 您的查询具有以下错误:不支持的配置单元类型:带有时区的时间戳 但是,当我自己运行查询时,它可以正常工作,并且在这里提到From_iso8601_timestamp作为有效的日期函数。 谁能告诉我我在做什么错? 问题答案: 不幸的是,雅典娜并不完全支持Presto的所有功能,它具有局限性,并且在技术上比Presto落后几个版本。有一些尝试使A

  • 通常,当一个文件必须上传到s3时,它必须首先写入磁盘,然后使用像TransferManager api这样的应用程序上传到云端。如果上传不能按时完成,这会导致数据丢失(应用程序宕机并在不同的服务器上重新启动,等等)。所以我想知道是否有可能直接通过网络写入一个流,并将所需的云位置作为接收器。

  • 我正在使用Glue将CSV的从S3 bucket到AWS的Athena进行流水线处理,列的标题只是默认的'col0'、'col1'等,而列的真正标题是在第一行条目中找到的。在管道过程中或早期的postgreSQL查询中,是否有一种方法可以使第一行条目成为列名?最好避免在胶水爬行器中直接硬编码列名。

  • 我试图从我的Lambda代码查询雅典娜视图。为不同帐户中的S3文件创建雅典娜表。雅典娜查询编辑器给我下面的错误: 拒绝访问(服务:Amazon S3;状态代码:403;错误代码:AccessDended; 我试图从我的Lambda代码访问Athena View。创建Lambda执行角色,并在另一个帐户S3桶的桶策略中允许此角色,如下所示: 从Lambda,得到以下错误: 此Lambda函数正在使用