Загрузить вывод Athena в таблицу Athena

Я использовал Athena для запроса таблицы и получил выходной файл в виде CSV, который выглядит следующим образом:

"col_a_string","col_b_string","col_c_timestamp","col_d_int"

Теперь я хочу взять файл csv и загрузить его в другую таблицу Athena, чтобы я мог проверить свои данные и использовать их, но когда я определяю свою таблицу с помощью FIELDS TERMINATED BY ',', значения сохраняют круглые скобки, и все поля считаются строками (что дает мне пустые столбцы для столбцов timestamp и int).

Немного абсурдно, что Афина не может прочитать вывод Афины ... Как я могу определить свою таблицу, чтобы она могла игнорировать круглые скобки?

Спасибо!


person Bramat    schedule 11.04.2018    source источник
comment
я думаю, вы ищете aws.amazon.com/premiumsupport/knowledge -центр /   -  person sandeep rawat    schedule 12.04.2018
comment
Согласились, что это абсурд, учтите также, что вы не можете применять сжатие к выводу Афины из Афины. Вам нужно будет использовать что-то вроде Lambda или Glue, чтобы это произошло.   -  person Zerodf    schedule 13.07.2018


Ответы (4)


Похоже, теперь это функция: https://docs.aws.amazon.com/athena/latest/ug/ctas.html

Запрос CREATE TABLE AS SELECT (CTAS) создает новую таблицу в Athena на основе результатов оператора SELECT из другого запроса. Athena хранит файлы данных, созданные оператором CTAS, в указанном месте в Amazon S3. Для синтаксиса см. СОЗДАТЬ ТАБЛИЦУ КАК.

Используйте запросы CTAS, чтобы:

Создавайте таблицы из результатов запроса за один шаг, не запрашивая повторно наборы необработанных данных. Это упрощает работу с наборами необработанных данных.

Преобразуйте результаты запроса в другие форматы хранения, такие как Parquet и ORC. Это повышает производительность запросов и снижает затраты на запросы в Athena. Для получения информации см. Столбчатые форматы хранения.

Создавайте копии существующих таблиц, которые содержат только нужные вам данные.

person Brian C.    schedule 17.12.2018

Попробуй это:

CREATE EXTERNAL TABLE IF NOT EXISTS my_table (
  `col_a_string` String,
  `col_b_string` String,
  `col_c_timestamp` TIMESTAMP, 
  `col_d_int ` Int,       
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
   "separatorChar" = ",",
   "quoteChar"     = "\""
) LOCATION 's3://your-s3-location'
TBLPROPERTIES ("skip.header.line.count"="1")

Это работает для вас? Обратите внимание на атрибут quotechar в свойствах сериализации / десериализации.

person user152468    schedule 13.04.2018
comment
В openCSVSerde все типы столбцов в операторе создания таблицы должны быть перечислены как строки. Из документации: Когда вы используете Athena с OpenCSVSerde, SerDe преобразует все типы столбцов в STRING. Затем парсер в Athena анализирует значения из STRING на фактические типы на основе того, что он находит. Например, он анализирует значения в типы данных BOOLEAN, BIGINT, INT и DOUBLE, когда может их различить. Если значения находятся в TIMESTAMP в формате UNIX, Athena анализирует их как TIMESTAMP. Если значения находятся в TIMESTAMP в формате Hive, Афина анализирует их как INT. Значения типа DATE также анализируются как INT. - person marshpipes; 18.07.2018
comment
Чтобы в дальнейшем преобразовать столбцы в нужный тип в таблице, вы можете создать представление над таблицей и использовать CAST для преобразования в нужный тип. - person marshpipes; 18.07.2018

Вот как я обычно загружаю данные из csv.

CREATE EXTERNAL TABLE IF NOT EXISTS my_table(
 `col_a_string` String,
 `col_b_string` String,
 `col_c_timestamp` TIMESTAMP, 
 `col_d_int ` Int)  
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES ( 
 'separatorChar' = ',', 
 'quoteChar' = '\"', 
 'escapeChar' = '\\' )
STORED AS TEXTFILE 
LOCATION '<s3://filepath>'
TBLPROPERTIES ('has_encrypted_data'='false',
          "skip.header.line.count"="1");

Преимущество этого в том, что даже если некоторые столбцы имеют двойные кавычки, он будет правильно анализировать и загружать

например. col_a_string, "col_b_string", col_c_timestamp, "col_d_int"

person KVM    schedule 29.02.2020

Попробуй, сработало на мне

CREATE EXTERNAL TABLE `my_table`(
  col_a_string` String,
 `col_b_string` String,
 `col_c_timestamp` TIMESTAMP, 
 `col_d_int ` Int)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
WITH SERDEPROPERTIES ( 
  'escapeChar'='\\', 
  'separatorChar'=',') 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://<path>'
TBLPROPERTIES (
  'skip.header.line.count'='1')
person senrick    schedule 23.07.2020