Формат вывода запроса AWS Athena - PullRequest
0 голосов
/ 03 марта 2019

У меня есть корзина S3, которая содержит CSV-файлы (см. «Пример данных»).

Файлы были созданы в результате запроса Athena.

Я хочу обработать 'timeстолбец как десятичное число (17,7) и столбец размера как bigint.

Я определяю таблицу (см. «Определение таблицы») и, используя запрос (см. «Запрос» ниже), получаю «Ошибка 'ниже.

Мои вопросы :
Есть ли способ управления форматом вывода запроса Athena и получения csv без кавычек вокруг полей?(1545980216.9581780,1349 против "1545980216.9581780", "1349")

Предполагается, что ответ на предыдущий вопрос отрицательный.Как я могу запросить данные в таблице «del_me_later_4» и обработать поля как десятичные и bigint.

Образец данных

"time","size"
"1545751457.8957720","432"
"1545751458.0753407","583"
"1545751458.1407920","583"
"1545751458.1683733","560"

Определение таблицы

CREATE EXTERNAL TABLE `del_me_later_4`(
  `time` string, 
  `size` string)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY ',' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://del-me-later/'
TBLPROPERTIES (
  'skip.header.line.count'='1'  
)

Запрос

SELECT cast(time AS decimal(17,7)) as time,
       cast(size AS bigint) as size  
FROM "del_me_later_4"

Ошибка

INVALID_CAST_ARGUMENT: Cannot cast VARCHAR '"1545751457.8957720"' to DECIMAL(17, 7)

1 Ответ

0 голосов
/ 04 марта 2019

Я нашел решение.Я использую org.apache.hadoop.hive.serde2.OpenCSVSerde.

Когда вы используете Athena с OpenCSVSerde, SerDe преобразует все типы столбцов в STRING.Затем анализатор в Athena анализирует значения из STRING в фактические типы на основе того, что он находит.Например, он анализирует значения в типы данных BOOLEAN, BIGINT, INT и DOUBLE, когда может их различить.Если значения находятся в TIMESTAMP в формате UNIX, Athena анализирует их как TIMESTAMP.Если значения находятся в TIMESTAMP в формате Hive, Athena анализирует их как INT.Значения типа DATE также анализируются как INT.

См. https://docs.aws.amazon.com/athena/latest/ug/csv.html

''' CREATE EXTERNAL TABLE `{}`(
  `time` string, 
  `size` string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
  "separatorChar" = ","
)
LOCATION
  's3://{}/{}'
TBLPROPERTIES (
  'skip.header.line.count'='1'  
)
...