Как добавить данные в существующее хранилище метаданных Hive?

У меня есть несколько подкаталогов в S3, которые содержат файлы .orc. Я пытаюсь создать хранилище метаданных улья, чтобы запрашивать данные с помощью Presto/Hive и т. д. Данные плохо структурированы (нет согласованного разделителя, некрасивые символы и т. д.). Вот очищенный образец:

1488736466 199.199.199.199 0_b.www.sphericalcow.com.f9b1.qk-g6m6z24tdr.v4.url.name.com TXT IN: NXDOMAIN/0/143
1488736466 6.6.5.4 0.3399.186472.4306.6668.638.cb5a.names-things.update.url.name.com TXT IN: NOERROR/3/306 0\009253\009http://az.blargi.ng/%D3%AB%EF%BF%BD%EF%BF%BD/\009 0\009253\009http://casinoroyal.online/\009 0\009253\009http://d2njbfxlilvpsq.cloudfront.net/b_zq_ym_bangvideo/bangvideo0826.apk\009 

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

Как добавить больше данных в существующее хранилище метаданных улья?

Вот пример моего оператора создания хранилища метаданных куста с битом serde регулярного выражения:

DROP TABLE IF EXISTS test;

CREATE EXTERNAL TABLE test (field1 string, field2 string, field3 string, field4 string)
COMMENT 'fill all the tables with the datas.' 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' 
  WITH SERDEPROPERTIES (
"input.regex" = "([0-9]{10}) ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) (\\S*) (.*)",
"output.format.string" = "%1$s %2$s %3$s %4$s"
)
STORED AS ORC
LOCATION 's3://path/to/one/of/10/folders/'
tblproperties ("orc.compress" = "SNAPPY", "skip.header.line.count"="2");

select * from test limit 10;

Я понимаю, что, вероятно, есть очень простое решение, но я попробовал INSERT INTO вместо CREATE EXTERNAL TABLE, но он по понятным причинам жалуется на ввод, и я искал помощь в документации по hive и serde, но не смог найти ссылку на добавление в существующий магазин.


person TheProletariat    schedule 17.04.2017    source источник
comment
Ух ты. (1) Вы ничего не загружаете. Внешняя таблица — это интерфейс, содержащий инструкции для чтения и, возможно, записи данных. (2) Хранилище метаданных содержит определение таблицы, а не данных. (3) Я серьезно сомневаюсь, что вы запрашиваете файлы ORC с помощью RegexSerDe. Также нет указаний на ORC в определении внешней таблицы. (4) output.format.string устарел   -  person David דודו Markovitz    schedule 17.04.2017
comment
Есть 2 возможных решения. Добавьте структуру папок, чтобы мы увидели, что актуально. P.S. Добавьте образец данных — есть вероятность, что RegexSerDe здесь является излишним.   -  person David דודו Markovitz    schedule 17.04.2017
comment
Спасибо, @DuduMarkovitz. 1) плохой выбор слов; Я должен знать лучше. Отредактировано. 2) см. (1). 3) необработанные файлы имеют формат .orc, но я думаю, что мне не хватает строки stored as orc. Исправлено сейчас. 4) Я этого не знал - спасибо. Я добавлю образец данных. Там нет разделителя, поэтому необходимо регулярное выражение - уродливые данные. Вы, вероятно, можете сказать, но я новичок в экосистеме Hadoop, поэтому я ценю помощь.   -  person TheProletariat    schedule 17.04.2017


Ответы (2)


Возможное решение с использованием разделов.

CREATE EXTERNAL TABLE test (field1 string, field2 string, field3 string, field4 string) 
partitioned by (mypartcol string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' 
  WITH SERDEPROPERTIES (
"input.regex" = "([0-9]{10}) ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) (\\S*) (.*)"
)
LOCATION 's3://whatever/as/long/as/it/is/empty'
tblproperties ("skip.header.line.count"="2");

alter table test add partition (mypartcol='folder 1') location 's3://path/to/1st/of/10/folders/';
alter table test add partition (mypartcol='folder 2') location 's3://path/to/2nd/of/10/folders/';
.
.
.
alter table test add partition (mypartcol='folder 10') location 's3://path/to/10th/of/10/folders/';
person David דודו Markovitz    schedule 17.04.2017

Для @TheProletariat (ОП)

Кажется, в RegexSerDe нет необходимости, так как столбцы разделены пробелом (' ').
Обратите внимание на использование tblproperties ("serialization.last.column.takes.rest"="true")

create external table test 
(
    field1 bigint
   ,field2 string
   ,field3 string
   ,field4 string
)
row format delimited
fields terminated by ' '
tblproperties ("serialization.last.column.takes.rest"="true")
;
person David דודו Markovitz    schedule 17.04.2017
comment
На самом деле они не разделены пробелом. Это DNS-записи, которые могут принимать различные форматы, некоторые из которых содержат несколько пробелов, а некоторые — ни одного, например: TXT IN: NXDOMAIN/0/148 TXT IN: NOERROR/1/124 10090_10203\009sphericalcow.com\ 009 и т.д. - person TheProletariat; 17.04.2017