Создайте внешнюю таблицу, добавив два столбца, присутствующие в файле CSV в Hive / Athena

#sql #hive #presto #amazon-athena #external-tables

#sql #улей #presto #amazon-athena #external-таблицы

Вопрос:

У меня есть файл CSV, содержащий три столбца A, B, C.

Я хотел бы создать внешнюю таблицу поверх нее, содержащую два столбца A, (B C).

Возможно ли это сделать во время самого создания таблицы или я должен создать представление после создания таблицы?

Ответ №1:

Это невозможно с помощью CSVSerDe или LasySimpleSerDe, но возможно с помощью RegexSerDe. Каждый столбец в определении таблицы должен иметь соответствующую группу захвата () в input.regex.

Например, если файл разделен запятой, таблица может быть определена следующим образом:

  CREATE EXTERNAL TABLE mytable(
 colA string COMMENT '', 
 colBC string COMMENT '')
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.RegexSerDe' 
WITH SERDEPROPERTIES ( 
  'input.regex'= '^"?(.*?)"?,(.*)

ввод.регулярное выражение означает:

  1. ^ - начало привязки строки
  2. "? - необязательная цитата
  3. (.*?) - группа захвата для 1-го столбца - любой символ в любое время, не жадный
  4. "? - необязательная цитата
  5. , - запятая
  6. (.*) - захват группы для 2-го столбца (это будет захватывать все после первой запятой до конца)
  7. $ - конец привязки строки
Вы можете написать регулярное выражение, которое будет правильно фиксировать ваши данные. Вы можете отлаживать регулярные выражения без создания таблицы, используя regexp_replace :
 select regexp_replace('"A",B,C', --data string example
                      '^"?(.*?)"?,(.*)


LOCATION ...
ввод.регулярное выражение означает:

  1. ^ - начало привязки строки
  2. "? - необязательная цитата
  3. (.*?) - группа захвата для 1-го столбца - любой символ в любое время, не жадный
  4. "? - необязательная цитата
  5. , - запятая
  6. (.*) - захват группы для 2-го столбца (это будет захватывать все после первой запятой до конца)
  7. $ - конец привязки строки

Вы можете написать регулярное выражение, которое будет правильно фиксировать ваши данные. Вы можете отлаживать регулярные выражения без создания таблицы, используя regexp_replace :


, --regex with 2 capturing groups for 2 columns
'$1 | $2'); --pipe delimited columns should be returned

LOCATION …

ввод.регулярное выражение означает:

  1. ^ — начало привязки строки
  2. "? — необязательная цитата
  3. (.*?) — группа захвата для 1-го столбца — любой символ в любое время, не жадный
  4. "? — необязательная цитата
  5. , — запятая
  6. (.*) — захват группы для 2-го столбца (это будет захватывать все после первой запятой до конца)
  7. $ — конец привязки строки

Вы можете написать регулярное выражение, которое будет правильно фиксировать ваши данные. Вы можете отлаживать регулярные выражения без создания таблицы, используя regexp_replace :