Hive 配置单元中的分区列

Hive 配置单元中的分区列,hive,Hive,我必须在配置单元中使用列对表进行分区,该列也是表的一部分 例如: 表:雇员 列:employeeId、employeeName、employeeSalary 我必须使用employeeSalary对表进行分区。 因此,我编写以下查询: CREATE TABLE employee (employeeId INT, employeeName STRING, employeeSalary INT) PARTITIONED BY (ds INT); 我只是在这里用了ds这个名字,因为它不允许我用同

我必须在配置单元中使用列对表进行分区,该列也是表的一部分

例如:

表:雇员

列:employeeId、employeeName、employeeSalary

我必须使用employeeSalary对表进行分区。 因此,我编写以下查询:

 CREATE TABLE employee (employeeId INT, employeeName STRING, employeeSalary INT) PARTITIONED BY (ds INT); 
我只是在这里用了ds这个名字,因为它不允许我用同一个名字employeeSalary

我这样做对吗?此外,在表中插入值时,我必须使用逗号分隔的文件。现在,该文件由以下行组成: 2019年,约翰,2000年

作为一排。 如果我必须使用salary进行分区,我的第一个分区将是salary 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);

请告诉我是否正确…

以下是如何在指定的列上创建具有分区的配置单元表

CREATE TABLE employee (employeeId INT, employeeName STRING) PARTITIONED BY (employeeSalary INT);
分区列在分区依据部分中指定。 在蜂巢外壳中,您可以运行descripe employee;它将显示表中的所有列。在创建表时,您应该看到4列,而不是您试图获得的3列

对于load命令,您需要指定要写入的所有分区。我不太熟悉这些,主要是基于

大概是

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

也许,我认为,您应该首先将所有数据加载到一个表中,然后使用配置单元扩展多个插入:

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

下面是配置单元中分区表的工作原理: 1分区列数据/值不存储在仓库中的实际数据文件中,而是存储在配置单元元存储中

2所以您不应该在配置单元仓库目录中的数据文件中包含分区列数据

对于您的问题,这些应该是步骤

一,

创建表employee employeeId INT,employeeName字符串由employeeSalary INT分区存储为

这将在配置单元元存储中创建一个条目,您已经创建了一个包含两列employeeId INT、employeeName STRING的表,并且它有一个分区列EmployeePalary INT

2创建一个临时表,比如emp_temp

CREATE TABLE emp_temp (employeeId INT, employeeName STRING,employeeSalary INT ) stored as text; 
我假设您的输入文件是文本格式的

3复制emp_temp表的仓库位置中的所有数据文件,或运行以下查询,我估计您在./example/files文件夹中有所有数据文件

将数据本地输入路径“/examples/files/*.txt”覆盖加载到表emp\u temp中

CREATE TABLE emp_temp (employeeId INT, employeeName STRING,employeeSalary INT ) stored as text; 
4现在运行以下hql,这将为您动态创建分区

 INSERT OVERWRITE TABLE employee partition(employeeSalary) 
   SELECT employeeId , employeeName , employeeSalary 
   from emp_temp
谢谢,
你好,谢谢你的回复。那么你的意思是说上传文件中只有两个值employeeId和employeeName?另外,对于employeeSalary,我必须在单独的查询中指定这两个值,例如:将数据本地加载到路径'./examples/files/kv2.txt'覆盖到表employee分区employeeSalary=2000;将本地数据加载到路径“/examples/files/kv2.txt”中,覆盖到表employee分区employeeSalary=4000;表中将有3列,您的文件每行应该有3个条目。员工工资是一列。我认为您应该使用一个查询,使用两个查询可能会产生相同的结果。。。我在将数据加载到多个分区方面做的工作还不够充分。