Могу ли я записать в таблицу Athena на s3, используя DBI? - PullRequest
0 голосов
/ 06 марта 2020

У меня есть соединение odb c с Афиной, и я уже могу читать и получать данные. Например, я создал новую пустую таблицу в кусте, которая использует тот же мета-хранилище, что и 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'

данные для этой таблицы должны храниться в s3 в этом месте.

Я пытался записать mtcars в это место, используя dbWriteTable:

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")

Это, кажется, работает в течение нескольких секунд, прежде чем вернуть это сообщение об ошибке:

Ошибка: nanodbc / nanodb c. cpp: 1617: 00000: [Симба] [Афина] (1040) Произошла ошибка в клиенте AWS Athena , Ошибка Афины: 130, код ответа HTTP: 400, имя исключения: InvalidRequestException, сообщение об ошибке: строка 1:14: нет подходящей альтернативы при вводе таблиц CREATE TABLE / adho c .db / mtcars "'[ИД выполнения: ] 'CREATE TABLE "таблицы / adho c .db / mtcars" ("row_names" VARCHAR (255), "mpg" ДВОЙНАЯ ТОЧНОСТЬ, "cyl" ДВОЙНАЯ ТОЧНОСТЬ, "disp" ДВОЙНАЯ ТОЧНОСТЬ, "hp" ДВОЙНАЯ ТОЧНОСТЬ, " drat "ДВОЙНАЯ ТОЧНОСТЬ, WT" ДВОЙНАЯ ТОЧНОСТЬ ", qse c" ДВОЙНАЯ ТОЧНОСТЬ ", против" ДВОЙНАЯ ТОЧНОСТЬ ", am" ДВОЙНАЯ ТОЧНОСТЬ, "шестерня", ДВОЙНАЯ ТОЧНОСТЬ, "карбюратор" ДВОЙНАЯ ТОЧНОСТЬ)

Похоже, dbi пытается создать новую таблицу, в которую я просто хочу добавить существующую, хотя и пустую, созданную ранее.

Как я могу отправить фрейм данных на s3, используя DBI?

1 Ответ

1 голос
/ 09 марта 2020

Я не могу комментировать odbc, но есть два пакета RAthena и noctua, которые имеют DBI методы для загрузки данных в AWS Афина.

RAthena использует Python SDK boto3 для создания соединения с AWS. noctua использует R SDK paws для создания соединения с 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")

В настоящее время эти пакеты поддерживают только file.types ["tsv", "csv", "parquet"] при загрузке в AWS Athena. Чтобы расширить возможности текущих пакетов, пожалуйста, поднимите запрос функции: https://github.com/DyfanJones/RAthena/issues и https://github.com/DyfanJones/noctua/issues.

ПРИМЕЧАНИЕ: Don не загружать оба пакета в тех же средах, что и классы соединений, которые будут sh.

...