更新配置单元表时出现问题

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 删除单元格时出现异常

更新相互链接的三个表时出现问题

将对象粘贴到空单元格/工作表时出现错误 424 未被识别为对象

尝试使用 POJO 记录更新表时出现 Java jOOQ 问题