#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-го столбца (это будет захватывать все после первой запятой до конца)
$
- конец привязки строки
Вы можете написать регулярное выражение, которое будет правильно фиксировать ваши данные. Вы можете отлаживать регулярные выражения без создания таблицы, используя regexp_replace
:
select regexp_replace('"A",B,C', --data string example
'^"?(.*?)"?,(.*)
LOCATION ...
ввод.регулярное выражение означает:
^
- начало привязки строки"?
- необязательная цитата(.*?)
- группа захвата для 1-го столбца - любой символ в любое время, не жадный"?
- необязательная цитата,
- запятая(.*)
- захват группы для 2-го столбца (это будет захватывать все после первой запятой до конца)$
- конец привязки строки
Вы можете написать регулярное выражение, которое будет правильно фиксировать ваши данные. Вы можете отлаживать регулярные выражения без создания таблицы, используя regexp_replace
:
, --regex with 2 capturing groups for 2 columns
'$1 | $2'); --pipe delimited columns should be returned
LOCATION …
ввод.регулярное выражение означает:
^
— начало привязки строки"?
— необязательная цитата(.*?)
— группа захвата для 1-го столбца — любой символ в любое время, не жадный"?
— необязательная цитата,
— запятая(.*)
— захват группы для 2-го столбца (это будет захватывать все после первой запятой до конца)$
— конец привязки строки
Вы можете написать регулярное выражение, которое будет правильно фиксировать ваши данные. Вы можете отлаживать регулярные выражения без создания таблицы, используя regexp_replace
: