我正在尝试将记录更新到hive表中。我正在使用以下语法从另一个现有的配置单元表创建配置单元表(这是我们需要将表创建为自动脚本的方式):
CREATE TABLE employee_master STORED as ORC as SELECT * FROM EMPLOYEE_SAMPLE;
ALTER TABLE employee_master clustered by (employeeid) into 2 buckets;
ALTER TABLE employee_master SET TBLPROPERTIES ('transactional'='true');`
运行上述命令后,使用ACID支持创建employee_master表,如下所示: 我从另一个类似的表中加载了100条记录。表中的10个样本记录如下:
当我在桌面上运行select *时,我可以看到所有100条记录,并选择count(*)命令也显示count为100,即表包含100条记录。
现在,我想使用以下查询逐个更新上述示例记录中的5条记录:
Update employee_master SET department="FIRE DEPARTMENT" where employeeid=100;
Update employee_master SET department="STREETS & SAN DEPARTMENT" where employeeid=52;
Update employee_master SET department="FAMILY & SUPPORT SERVICES" where employeeid=26;
Update employee_master SET department="POLICE DEPARTMENT" where employeeid=54;
Update employee_master SET department="FIRE DEPARTMENT" where employeeid=14;
根据HIVE交易文档更新employee_master表时,会创建一个与一行更新相对应的增量文件。更新所有上述记录后,employee_master表的文件结构如下所示:
在运行count()和statistics命令时,我仍然看到100条记录作为输出。 在主要压缩(在表上有条理地或自动地)运行之后,我只能看到表中的11条记录作为select()命令的输出。意思是,当我从employee_master运行select()时,我只能看到11条记录,而这是不正确的。在更新表格之前,输出应显示所有100条记录; 运行count()和statistics命令时如下;将计数显示为100条记录如下:
我在不同的表/服务器上以相同的方式多次尝试过这个练习,但都显示出相同的意外输出。不确定我是否遗漏了某些东西,或者这是一个错误。
注意:我尝试使用create table语法创建ORC事务表,如下所示:
CREATE IF NOT EXISTS employee_master (
employeeid INT,
name string,
jobtitle string,
department string,
annualsalary DECIMAL(10,2))
COMMENT "Employee Master - Table"
CLUSTERED BY (employeeid) INTO 2 BUCKETS
STORED AS ORC
TBLPROPERTIES ("transactional"="true")
然后我没有遇到上述问题,但这不符合我们目前的要求。
我使用以下软件版本:
答案 0 :(得分:1)
将Hive更新为> = 1.3会是您的选择吗?根据{{3}}:
ACID表不支持使用ALTER TABLE进行架构更改。 HIVE-11421正在跟踪它。已在1.3.0 / 2.0.0中修复。
由于您正在使用Hive 1.2.100并且您正在尝试执行ALTER TABLE
命令,因此我认为您遇到的问题与此相关。
答案 1 :(得分:1)
你做不到
ALTER TABLE employee_master clustered by (employeeid) into 2 buckets;
创建表后,其中包含数据,至少不是transactional = true表。这不会“重新打包”首先未正确加载的表。
为什么不
CREATE IF NOT EXISTS employee_master (
employeeid INT,
name string,
jobtitle string,
department string,
annualsalary DECIMAL(10,2))
COMMENT "Employee Master - Table"
CLUSTERED BY (employeeid) INTO 2 BUCKETS
STORED AS ORC
TBLPROPERTIES ("transactional"="true")
然后
INSERT INTO employee_master SELECT * FROM EMPLOYEE_SAMPLE;
这应该工作得很好。它将正确填充表格,您将能够在其上运行更新命令。