更新配置单元表时出现问题
Posted
技术标签:
【中文标题】更新配置单元表时出现问题【英文标题】:Issue while updating hive table 【发布时间】:2016-10-23 09:39:36 【问题描述】:我正在尝试将记录更新到配置单元表中。我正在使用以下语法从另一个现有的 hive 表创建 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 条样本记录如下:
"employeeid","name","jobtitle","department","annualsalary" "100","ADAMCZYK LAWRENCE M","FIREFIGHTER","FIRE","79926" "52","ACCIARI NICHOLAS B","MOTOR TRUCK DRIVER","STREETS & SAN","71469" "26","ABRAHAM DALINA D","社区服务","家庭与支持","69684" "54","ACEVEDO AARON F","警官","POLICE","60918" "14","ABDOLLAHZADEH ALI","PARAMEDIC","FIRE","64374" "56","ACEVEDO BIENVENIDO","警官","警察","77238" "28","ABRAHAM GODWIN K","TECHNICIAN V","BUSINESS AFFAIRS","84888" "58","ACEVEDO DAILHA","疾病控制调查员 II","健康","48108" "8","ABBOTT BETTY L","FOSTER GRANDPARENT","家庭与支持","2756" "60","ACEVEDO EDWIN C","FIREFIGHTER","FIRE","83148"当我在表上运行 select * 时,我可以看到所有 100 条记录,并且 select count (*) 命令也显示计数为 100,即表包含 100 条记录。
employee_master 表的目录结构如下所示:
现在我想使用以下查询从上述示例记录中一一更新 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 () 和统计命令时,我仍然看到 100 条记录作为输出。 在表上运行 Major Compaction(手动或自动)后,我只能看到表中的 11 条记录作为 select () 命令的输出。意思是,当我从employee_master 运行select () 时,我只能看到11 条记录如下,而 不正确。输出应显示更新表之前的所有 100 条记录; 在运行 count() 和统计命令时,如下所示;显示计数为 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")
然后我没有遇到上述问题,但这不符合我们当前的要求。
我正在使用以下软件版本:
HDP-2.4.0.0-169 Hive 1.2.1000 Centos 6.8 在 TEZ 客户端上运行 Hive【问题讨论】:
【参考方案1】:将 Hive 更新到 >= 1.3 是否适合您?根据documentation:
ACID 表不支持使用 ALTER TABLE 更改架构。 HIVE-11421 正在跟踪它。已在 1.3.0/2.0.0 中修复。
由于您使用的是 Hive 1.2.100 并且您正在尝试执行 ALTER TABLE
命令,我认为您遇到的问题与此有关。
【讨论】:
谢谢詹姆。我不知道 HIVE-11421。将尝试更新到最新版本。【参考方案2】:你做不到
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;
这应该可以正常工作。它将正确填充表格,您将能够在其上运行更新命令。
【讨论】:
感谢尤金的快速回复。正如我在帖子的注释部分中提到的,在创建表的同时使表跨国化对我有用,但我不确定为什么它不能与 ALTER 表一起使用。您的回答澄清了我的疑问,因为 => 在创建表后有数据,至少不是 transactional=true 表。这不会“重新存储”最初未正确加载的表以上是关于更新配置单元表时出现问题的主要内容,如果未能解决你的问题,请参考以下文章
重新加载行以更新 UITableView 中的单元格高度时出现问题
获取'无效更新:尝试从 UICollectionView 删除单元格时出现异常