我必须将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);
请让我知道我是不是......
答案 0 :(得分:4)
以下是如何使用指定列上的分区创建配置单元
CREATE TABLE employee (employeeId INT, employeeName STRING) PARTITIONED BY (employeeSalary INT);
分区列在PARTITIONED BY
部分中指定
在Hive shell中,您可以运行describe employee;
,它将显示表中的所有列。使用CREATE TABLE
,您应该看到4列,而不是您想要获得的3列。
对于load命令,您需要指定要写入的所有分区。 (我对这些并不十分熟悉,主要基于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 :(得分:1)
以下是hive中分区表的工作原理: 1)分区列数据/值不存储在仓库中的实际数据文件中,而是存储在hive元存储中。
2)所以你不应该在hive仓库目录的数据文件中有分区列数据。
对于您的问题,这些应该是步骤。
1)
CREATE TABLE employee (employeeId INT, employeeName STRING ) PARTITIONED BY (employeeSalary INT) stored as <your choice of format>;
这将在hive Metastore中创建一个条目,您创建了一个包含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
谢谢, 阿迪亚
答案 2 :(得分: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