Рубрики
Без рубрики

Покорение Амазонки Афины с кофеином с помощью трех упаковок metis

Я должен предварить этот пост утверждением, что если вы делаете что-то интерактивное() с Amazon, то… С тегами athena, java, linux, r.

Я должен предварить этот пост утверждением, что если вы делаете что-либо интерактивное() с Amazon Athena, вам следует серьезно подумать о том, чтобы просто использовать их бесплатные драйверы ODBC , так как это самый простой способ подключить их к R DBI – и привести в порядок. Я говорил об этом в предыдущих постах . Оставьте заметку в комментариях, если вы не знаете заклинаний для переупаковки предоставленных драйверов Linux ODBC для работы с вашим вкусом Linux.

Однако

Бывают моменты — скажем, когда вы пытаетесь настроить службу R в своем кластере kubernetes, которая соединяет данные в Athena с анализом и визуализацией в R, — когда драйверы ODBC могут быть скорее помехой, чем помощью, а JDBC – это путь наименьшего сопротивления.

Конечно, есть в-КРАН AWR.Афина посылка но это довольно ограниченная и малофункциональная прокладка JDBC, которая выполняет основную работу, но не намного больше.

Входить:

три пакета, цель которых – упростить подключение R к Amazon Athena, когда ODBC недоступен.

Почему Три Упаковки?

Для начала, есть большие надежды на метис -трио и одним из ключевых компонентов этого является разделение банок в одну упаковку ( metis.банки ) и фактическая функциональность в других ( metis и метис.аккуратный ). Мы посмотрим, как пройдет попытка CRAN, так как упаковка БАНКИ весит достаточно, чтобы гарантировать ПРИМЕЧАНИЕ . Упаковка драйвера уменьшает необходимость предварительной загрузки JAR (локально или, скажем, в образ Docker) или выполнения инициированной пакетом загрузки, например AWR.Афина делает (что я до сих пор не понимаю, почему это не вышвырнуло его из КРАНА так, как он это делает, но _(ツ)_/).

метис.jars также имеет три вспомогательные функции, которые выполняют некоторые (базовые) забавные вещи:

library(metis.jars)

simba_driver_version()
## [1] "02.00.06.1008"

athena_supported_types()
## [1] "BOOLEAN" "TINYINT" "SMALLINT" "INT" "INTEGER"  
## [6] "BIGINT" "REAL" "FLOAT" "DOUBLE" "DECIMAL"  
## [11] "DATE" "TIMESTAMP" "BINARY" "VARBINARY" "CHAR"     
## [16] "VARCHAR" "STRING" "ARRAY" "MAP" "ROW"      
## [21] "STRUCT"   

metis_jar_path()
## [1] "/Library/Frameworks/R.framework/Versions/3.5/Resources/library/metis.jars/java/AthenaJDBC42_2.0.6.jar"

Первый использует интерфейс java для прямого запроса версии (поскольку Amazon, похоже, обновляет Simba JAR два раза в год). Выделив БАНКУ в отдельный пакет, можно чаще обновлять два других пакета-брата, не занимая дискового пространства CRAN. метис.jars также имеет версию для включенной JAR, поэтому управление конфигурацией будет проще для пользователей.

Причина второй функции списка типов заключается в том, что есть надежда, что Amazon добавит поддержку все Типы данных Presto, особенно IP-АДРЕС . Он, опять же, выполняет самоанализ драйвера JDBC для сбора поддерживаемых типов.

Наконец, третья функция абстрагирует местоположение JAR из пакета metis или даже вашего собственного пакета интерфейса, если вы решите зависеть от него.

Хорошо, Но Почему Бы Не Просто Два?

Пакет metis является более функциональным суперклассом RJDBC оболочки DBI, чем AWR.Афина . Единственное, что он делает, с чем не может справиться его двоюродный брат – это справиться БИГИНТ s правильно:

library(metis)

dbConnect(
  metis::Athena(),
  Schema = "sampledb",
  AwsCredentialsProviderClass = "com.simba.athena.amazonaws.auth.PropertiesFileCredentialsProvider",
  AwsCredentialsProviderArguments = path.expand("~/.aws/athenaCredentials.props")
) -> con

dbGetQuery(con, "
SELECT
  CAST('chr' AS CHAR(4)) achar,
  CAST('varchr' AS VARCHAR) avarchr,
  CAST(SUBSTR(timestamp, 1, 10) AS DATE) AS tsday,
  CAST(100.1 AS DOUBLE) AS justadbl,
  CAST(127 AS TINYINT) AS asmallint,
  CAST(100 AS INTEGER) AS justanint,
  CAST(100000000000000000 AS BIGINT) AS abigint,
  CAST(('GET' = 'GET') AS BOOLEAN) AS is_get,
  ARRAY[1, 2, 3] AS arr1,
  ARRAY['1', '2, 3', '4'] AS arr2,
  MAP(ARRAY['foo', 'bar'], ARRAY[1, 2]) AS mp,
  CAST(ROW(1, 2.0) AS ROW(x BIGINT, y DOUBLE)) AS rw,
  CAST('{\"a\":1}' AS JSON) js
FROM elb_logs
LIMIT 1
") %>% 
  dplyr::glimpse()
## Observations: 1
## Variables: 13
## $ achar  "chr "
## $ avarchr  "varchr"
## $ tsday  2014-09-29
## $ justadbl  100.1
## $ asmallint  127
## $ justanint  100
## $ abigint  100000000000000000
## $ is_get  TRUE
## $ arr1  "1, 2, 3"
## $ arr2  "1, 2, 3, 4"
## $ mp  "{bar=2, foo=1}"
## $ rw  "{x=1, y=2.0}"
## $ js  "\"{\\\"a\\\":1}\""

Престо Массивы и карты Athena, строки и ДЖЕЙСОН встречаются как символы из драйвера Athena, и они отформатированы так плохо, что мало надежды на полную поддержку R для списка столбцов для них. Но , вы получаете реальные большие целые числа с метисом наряду с полной поддержкой всех других текущих типов Athena.

R люди, которые могут быть пользователями старого, автономного metis пакета, должны знать о некоторых вещах.

Во-первых, DBConnect() имеет кардинальные изменения. Имена snake_case, которые все еще существуют в функции более высокого уровня athena_jdbc() , исчезли. В обмен на эту боль у вас теперь есть полное соответствие именам со всеми свойствами подключения Athena JDBC и вы можете с большей легкостью использовать альтернативных поставщиков учетных данных, которые metis ‘двоюродный брат совершенно не может сделать для вас , что показано в примере выше и в пакете README.

Пакет metis также облегчает просмотр документации для все доступные свойства подключения Athena, так как в нем есть виньетка с описательной таблицей всех из них (отображается здесь ).

Существует также зарождающаяся поддержка “потокового API” (TL DR: более быстрая загрузка набора результатов), но она не будет полностью протестирована до тех пор, пока на этой неделе не произойдут некоторые изменения политики AWS.

Попался. Но — Срсли — Почему Бы Не Просто Два?

Как бы это ни было потрясающе (включая поддержку базового образа Docker), аккуратный стих не лишен накладных расходов с точки зрения времени компиляции и зависимостей, которые особенно болезненны в системах Linux и некоторых средах Docker. Вы можете абсолютно обойтись некоторыми хорошо проработанными SQL и JDBC, и чем тоньше изображение, тем проще его развертывать и масштабировать.

Но! Аккуратный стих так полезен что обеспечение бесперебойной поддержки Афины имеет решающее значение. Сам по себе/|метис подключается к dplyr / / dplyr хорошо, но предоставив (в метис.аккуратный ) некоторые улучшенные db_data_type() поддержка (в первую очередь для BIGINT ) и некоторые дополнительные 💙 ) в sql_translate_env() ) для тех из нас, кто продолжает бездумно использовать глаголы только на R, такие как grep() или as. POSIXct() в контекстах, отличных от R) мы можем повысить уровень интерактивного()

library(metis.tidy)
library(dbplyr)
library(dplyr)

metis::dbConnect(
  metis::Athena(),
  Schema = "sampledb",
  AwsCredentialsProviderClass = "com.simba.athena.amazonaws.auth.PropertiesFileCredentialsProvider",
  AwsCredentialsProviderArguments = path.expand("~/.aws/athenaCredentials.props")
) -> con

elb_logs <- tbl(con, "elb_logs")

filter(elb_logs, grepl("20", elbresponsecode)) %>%
  mutate(
    tsday = as.Date(substring(timestamp, 1L, 10L)),
    host = url_extract_host(url),
    proto_version = regexp_extract(protocol, "([[:digit:]\\.]+)"),
  ) %>%
  select(tsday, host, receivedbytes, requestprocessingtime, proto_version) %>%
  head(1) %>%
  glimpse()
## Observations: ??
## Variables: 5
## Database: AthenaConnection
## $ tsday  2014-09-29
## $ host  "www.abcxyz.com"
## $ receivedbytes  0
## $ requestprocessingtime  9.5e-05
## $ proto_version  "1.1"

плавник

Довольно большим стимулом для этого радикального рефакторинга стала необходимость использования интерфейса Athena JDBC в Rat$DAYJOB в бессерверном контексте. Так что, если бы я/мы нуждались в этом, другие тоже могли бы. Во всех трех пакетах есть тесты (которые работают с моей личной настройкой Athena, которая легко копируется, так как это просто схема и таблица по умолчанию, которые вы получаете, когда включаете Athena), проходят проверки CRAN и будут работать в реальной производственной среде к тому времени, когда вы прочтете это.

Обратите внимание, что у меня есть планы CRAN для этих трех друзей, но все три пакета должны быть отправлены одновременно, и мне нужно пройти тесты – и доказать, что тесты в прямом эфире в Трэвисе, прежде чем отправлять. Сейчас самое время для запросов функций, сообщений о проблемах или проблемах. До тех пор, пока источник (sr.ht ) API завершен, указанные взносы лучше оставить на GitLab (предпочтительно) или GitHub (если вы должны продолжать пополнять казну гигантских мультинациональных компаний, которые подрывают вашу свободу).

ПОСТСКРИПТУМ

Еще одной причиной для повторного посещения метис был этот R-сбой java проблема это действительно проблема реализации Simba Athena (сигналы ОС в драйвере JDBC, rly ?)

Это Профиль запись:

options(
  "java.parameters" = c(getOption("java.parameters", default = NULL), "-Xrs")
)

был надежным обходным путем до тех пор, пока java не будет обновлен. Обратите внимание, что метис.jars предупреждает об этом при загрузке, если обнаруживает, что ваша установка находится под угрозой.

Оригинал: “https://dev.to/hrbrmstr/conquering-caffeinated-amazon-athena-with-the-metis-trio-of-packages-1mgb”