2017-01-25 3 views
1

Я создал таблицу улья по следующей схеме и схеме avro, которые у меня были.Импортируйте данные из .avro-файлов в таблицу hive

CREATE TABLE table_name 
PARTITIONED BY (t string, y string, m string, d string, h string, hh string) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' 
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' 
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' 
TBLPROPERTIES (
'avro.schema.url'='hdfs://location/schema.avsc'); 

Теперь я хочу сбросить данные, которые у меня есть в HDFS, чтобы создать таблицу.

У меня есть местоположение HDFS, где у меня есть данные в структуре каталогов как t/y/m/d/h/hh/data.avro У меня есть несколько каталогов в соответствии с разделом, потому что это мои столбцы разделов.

Я хочу сбросить все данные в созданную таблицу.

Я пробовал использовать внешнюю таблицу, но она дает исключения.

ответ

2

Если вы следуете за соглашением об улей в своей папке hdfs и создаете таблицу улья, указывающую на расположение таблицы, вы должны запустить инструкцию таблицы ремонта msck.

Например

CREATE TABLE table_name 
PARTITIONED BY (t string, y string, m string, d string, h string, hh string) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' 
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' 
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' 
TBLPROPERTIES (
'avro.schema.url'='hdfs://location/schema/schema.avsc') 
location "hdfs:///location/data; 

и загрузить данные, такие как

/location/data/y=2016/m=02/d=03/h=03/hh=12/data.avro /location/data/y = 2016/m = 02/d = 03/h = 03/hh = 13/data2.Avro

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

msck repair table table_name; 

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

ALTER TABLE table_nameADD PARTITION (y='01',m='02',d='03',h='03',hh='12') location '/yourpath/y=2016/m=02/d=03/h=03/hh=12/'; (or any other folder) 
1

Вы можете вставить команду LOCATION 'path_hdfs' во время запроса для создания внешней таблицы или с помощью команды LOAD DATA LOCAL INPATH 'path_hdfs' OVERWRITE INTO TABLE table_name; с использованием физической таблицы.

UPDATE:

Как спросил ОП, добавить больше информации о разделении. Вы должны указать команду PARTITIONED BY (day string) (пример для переменной 'day' типа данных 'string') во время создания запроса. В качестве полного примера см. Ответ, предоставленный озером. Тогда, если ваши данные о создании уже имеют следующие значения для 'дня':

  • дня = 2017-11-02
  • дня = 2017-11-03
  • дня = 2017-11-04

Когда вы запустите команду MSCK REPAIR TABLE <table>, будут добавлены разделы для этих трех значений. На следующий день, если вы получите данные за день = 2017-11-05, при запуске MSCK REPAIR TABLE <table> будет добавлен новый раздел для нового значения:

  • день = 2017-11-05

Физически добавление раздела будет организовывать данные в разные папки на HDFS. Для создания раздела вам понадобятся права на запись ваших данных. Но если у вас уже есть разделы, просто проверьте, будет ли в папке установлена ​​каждая папка, названная в следующем формате: «day = 2017-11-02». Таким образом, когда вы запускаете команду MSCK REPAIR, разделы будут автоматически загружаться в метаданные. Я всегда работал с внешними таблицами, и я использовал этот трубопровод безупречно.

+0

Я не могу использовать LOCATION 'path_hdfs' для создания внешней таблицы, потому что у меня нет разрешения на запись на диске. – KrunalParmar

+0

, когда я использую команду LOAD DATA, я получаю следующее исключение ,,, FAILED: SemanticException [Ошибка 10062]: нужно указать столбцы разделов, потому что таблица назначения разделена .... Как я могу указать раздел? – KrunalParmar

+0

Вы должны объявить разделы во время создания запроса, а затем периодически запускать команду MSCK REPAIR

для обновления разделов после того, как вы импортировали новые данные (с новыми значениями на стороне раздела). Например, если вы разделяете по дням, каждый день вы должны запустить команду MSCK REPAIR, чтобы добавить новый день в разделы. Теперь я обновляю свой ответ с помощью синтаксиса разбиения. –

0

Приведенный ниже синтаксис будет полезен.

CREATE EXTERNAL TABLE table_name 
    PARTITIONED BY (part string) 
    ROW FORMAT SERDE 
    'org.apache.hadoop.hive.serde2.avro.AvroSerDe' 
    WITH SERDEPROPERTIES (
    'avro.schema.url'='hdfs:///path/to/avro/schema/') 
    STORED AS INPUTFORMAT 
    'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' 
    OUTPUTFORMAT 
    'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' 
    LOCATION 'path/to/location' 

    ALTER TABLE table_name ADD PARTITION (part='part_name') LOCATION 'location' 

 Смежные вопросы

  • Нет связанных вопросов^_^