蜂巢中的分区列

Sou*_*hra 6 hive

我必须hive用一个列分隔表,这也是表的一部分.

例如:

表:员工

列: employeeId,employeeName,employeeSalary

我必须使用employeeSalary对表进行分区.所以我写下面的查询:

 CREATE TABLE employee (employeeId INT, employeeName STRING, employeeSalary INT) PARTITIONED BY (ds INT); 
Run Code Online (Sandbox Code Playgroud)

我刚刚在这里使用了名称"ds",因为它不允许我使用相同的名称employeeSalary.

这是正确的我在做什么?同时在表中插入值时,我必须使用逗号分隔文件.现在该文件包含如下行:2019,John,2000

作为一排.如果我必须使用薪水进行分区,我的第一个分区将是所有人的工资2000.所以查询将是

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

在薪水为2000的100个条目之后,我接下来有500个条目,工资为4000.所以我会再次触发查询:

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

请让我知道我是否正确......

Qui*_*nnG 6

以下是如何在您指定的列上创建一个带有分区的 hive 表

CREATE TABLE employee (employeeId INT, employeeName STRING) PARTITIONED BY (employeeSalary INT);
Run Code Online (Sandbox Code Playgroud)

分区列在该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);
Run Code Online (Sandbox Code Playgroud)


Adi*_*wal 5

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

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

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

1)

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

这将在 Hive 元存储中创建一个条目,您已创建一个包含 2 列 employeeId INT、employeeName STRING 的表,并且该表具有一个分区列 employeeSalary INT。

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

CREATE TABLE emp_temp (employeeId INT, employeeName STRING,employeeSalary INT ) stored as text; 
Run Code Online (Sandbox Code Playgroud)

我假设您的输入文件是文本格式。

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
Run Code Online (Sandbox Code Playgroud)

谢谢,阿迪亚