разделить столбец в улье - PullRequest
5 голосов
/ 15 марта 2011

Мне нужно разделить таблицу на hive со столбцом, который также является частью таблицы.

Например:

Таблица: сотрудник

Столбцы: employeeId, employeeName, employeeSalary

Мне нужно разбить таблицу, используя employeeSalary .Поэтому я пишу следующий запрос:

 CREATE TABLE employee (employeeId INT, employeeName STRING, employeeSalary INT) PARTITIONED BY (ds INT); 

Я просто использовал здесь имя «ds», так как оно не позволило мне ввести то же имя employeeSalary.

Это правильно?что я делаю?Также при вставке значений в таблицу я должен использовать файл, разделенный запятыми.Теперь файл состоит из строки вроде: 2019, Джон, 2000

как одна строка.Если мне придется разделить, используя зарплату, мой первый раздел будет состоять из людей с зарплатой 2000. Таким образом, запрос будет

LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE employee PARTITION (ds=2000);

Опять после 100 записей с зарплатой 2000, у меня есть следующие 500 записей с зарплатой 4000Поэтому я бы снова запустил запрос:

LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE employee PARTITION (ds=4000);

ПОЖАЛУЙСТА, ДАЙ МНЕ ЗНАЕТЕ, ЕСЛИ Я ПРАВДА ...

Ответы [ 3 ]

4 голосов
/ 16 марта 2011

Ниже описано, как создать таблицу кустов с разделом в указанном вами столбце

CREATE TABLE employee (employeeId INT, employeeName STRING) PARTITIONED BY (employeeSalary INT);

Столбец раздела указан в разделе PARTITIONED BY.
В оболочке Hive вы можете запустить describe employee; и он покажет все столбцы в таблице.С вашим CREATE TABLE вы должны увидеть 4 столбца, а не 3, которые вы пытаетесь получить.

Для вашей команды загрузки вы захотите указать все разделы для записи.(Я не очень знаком с ними, в основном на основе http://wiki.apache.org/hadoop/Hive/LanguageManual/DML#Syntax

Так что-то вроде

LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE employee PARTITION (employeeSalary=2000, employeeSalary=4000);
1 голос
/ 12 февраля 2018

Вот как работает таблица разделов в кусте: 1) данные / значение столбца раздела не сохраняются в реальном файле данных в хранилище, а хранятся в мета-хранилище куста.

2)не должно быть данных столбца раздела в файлах данных в каталоге хранилища куста.

для вашей проблемы это должны быть шаги.

1)

CREATE TABLE employee (employeeId INT, employeeName STRING ) PARTITIONED BY (employeeSalary INT) stored as <your choice of format>;

Это создаст запись в метасольве улья, в которой вы создали таблицу с 2 столбцами employeeId INT, employeeName STRING и в которой имеется один столбец раздела employeeSalary INT.

2) создайте временную таблицускажем, emp_temp.

CREATE TABLE emp_temp (employeeId INT, employeeName STRING,employeeSalary INT ) stored as text; 

Я предполагаю, что ваши входные файлы в текстовом формате.

3) скопируйте все свои файлы в хранилище таблицы emp_temp ИЛИ выполните следующий запрос (iя предполагаю, что у вас есть все файлы данных в папке ./example/files.)

LOAD DATA LOCAL INPATH './examples/files/*.txt' OVERWRITE INTO TABLE emp_temp.

4) теперь запустите следующий hql (это создаст для вас динамически разделы))

 INSERT OVERWRITE TABLE employee partition(employeeSalary) 
   SELECT employeeId , employeeName , employeeSalary 
   from emp_temp

Спасибо, адитья

0 голосов
/ 01 августа 2012

Может быть, я думаю, что вы должны сначала загрузить все данные в одну таблицу, затем использовать расширение Hive (несколько вставок):

FROM from_statement
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT          EXISTS]] select_statement1
[INSERT OVERWRITE TABLE tablename2 [PARTITION ... [IF NOT EXISTS]] select_statement2] 
[INSERT INTO TABLE tablename2 [PARTITION ...] select_statement2] ...;
FROM from_statement
INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1
[INSERT INTO TABLE tablename2 [PARTITION ...] select_statement2] 
[INSERT OVERWRITE TABLE tablename2 [PARTITION ... [IF NOT EXISTS]] select_statement2] ...;

Затем, если хотите, вы можете

from big_data_table
insert overwrite table table1 partiton (ds=2000)
select * where employeeId>0 && employeeId<101>
insert overwrite table table2 partition (ds=4000)
select * where employeeId>=101&&employeeId<=600
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...