partição da coluna na colmeia
tenho de dividir a tabela em hive
com uma coluna que também faz parte da tabela.
para eg:
quadro: empregado
colunas: empregado, empregado, empregado, empregado
{[[6]} tenho de repartir a tabela usando o sistema de distribuição de emprego. Então eu escrevo a seguinte pergunta: CREATE TABLE employee (employeeId INT, employeeName STRING, employeeSalary INT) PARTITIONED BY (ds INT);
acabei de usar o nome "ds" aqui porque ele não me permitiu colocar o mesmo nome {[[4]}.
É isto que estou a fazer? Também enquanto inserindo valores na tabela, eu tenho que usar um arquivo separado por vírgulas. Agora o ficheiro consiste numa linha como: 2019, John, 2000como uma fila. Se eu tiver que dividir usando o salário minha primeira partição seria todas as pessoas para salário 2000. Então a pergunta seria
LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE employee PARTITION (ds=2000);
Mais uma vez, após 100 entradas com salário igual a 2000, tenho 500 entradas com salário igual a 4000.
Então, eu voltaria a disparar a pergunta:
LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE employee PARTITION (ds=4000);
POR FAVOR, AVISA-ME SE TIVER RAZÃO...
3 answers
Aqui está como criar uma tabela de colmeias com uma partição na coluna que indicou
CREATE TABLE employee (employeeId INT, employeeName STRING) PARTITIONED BY (employeeSalary INT);
A coluna de partição é especificada na secção PARTITIONED BY
.
Na concha da colmeia você pode executar describe employee;
e ele irá mostrar todas as colunas na tabela. Com o seu CREATE TABLE
deve ver 4 colunas, não as 3 que está a tentar obter.
Para o seu comando de carga, irá querer especificar todas as partições onde escrever. (Eu não estou muito familiarizado com estes, principalmente baseando-se em http://wiki.apache.org/hadoop/Hive/LanguageManual/DML#Syntax
Então, algo como ...LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE employee PARTITION (employeeSalary=2000, employeeSalary=4000);
2) por isso não deve ter os dados da coluna de partição nos ficheiros de dados na pasta de armazenamento da colmeia.
Para o teu problema, estes devem ser os passos .1)
CREATE TABLE employee (employeeId INT, employeeName STRING ) PARTITIONED BY (employeeSalary INT) stored as <your choice of format>;
2) crie uma tabela temp permite dizer emp_temp.
CREATE TABLE emp_temp (employeeId INT, employeeName STRING,employeeSalary INT ) stored as text;
Presumo que os seus ficheiros de entrada estejam em formato de texto.
3) Copie todos os seus ficheiros no local do armazém da tabela emp_temp ou execute a seguinte consulta( estou a contar que tem todos os seus ficheiros de dados no ./exemplo / pasta de ficheiros.)
LOAD DATA LOCAL INPATH './examples/files/*.txt' OVERWRITE INTO TABLE emp_temp
.
4) Execute agora o seguinte hql ( isto irá criar partições dinamicamente para tu)
INSERT OVERWRITE TABLE employee partition(employeeSalary)
SELECT employeeId , employeeName , employeeSalary
from emp_temp
Obrigado.,
aditya
Talvez, eu acho que, em primeiro lugar, você deve carregar todos os dados em uma tabela, em seguida, usar a extensão da colmeia (múltiplas inserções):
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] ...;
Então, se quiseres, podes
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