8

我必须hive用一个列对表进行分区,该列也是表的一部分。

例如:

表:员工

列: employeeId、employeeName、employeeSalary

我必须使用 employeeSalary 对表进行分区。所以我写了以下查询:

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

我只是在这里使用了名称“ds”,因为它不允许我使用相同的名称employeeSalary

我在做什么是对的吗?此外,在将值插入表中时,我必须使用逗号分隔的文件。现在该文件由如下行组成:2019,John,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);

如果我是对的,请告诉我...

4

3 回答 3

6

这是在您指定的列上创建具有分区的配置单元表的方法

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

分区列在PARTITIONED BY节中指定。
您可以在 Hive shell 中运行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);
于 2011-03-15T21:10:04.013 回答
4

以下是 Hive 中分区表的工作原理: 1) 分区列数据/值不存储在仓库中的实际数据文件中,而是存储在 hive 元存储中。

2)所以你不应该在hive仓库目录的数据文件中有分区列数据。

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

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 表的仓库位置或运行以下查询(我假设您在 ./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

谢谢,阿迪亚

于 2018-02-12T13:17:57.283 回答
0

也许,我认为,您应该首先将所有数据加载到一个表中,然后使用 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
于 2012-08-01T02:36:15.273 回答