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

pvcm50d1  于 2021-06-28  发布在  Hive
关注(0)|答案(2)|浏览(443)

我正在尝试将记录更新到配置单元表中。我正在使用以下语法从另一个现有配置单元表创建配置单元表(这就是我们需要如何将表创建到自动脚本中):

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\主表,如下所示:

我从另一个类似的表中加载了100条记录。表中的10个样本记录如下:
“雇员ID”,“姓名”,“职务”,“部门”,“年薪”
“100”,“adamczyk lawrence m”,“消防员”,“火灾”,“79926”
“52”,“acciari nicholas b”,“卡车司机”,“streets&san”,“71469”
“26”,“abraham dalina d”,“社区服务”,“家庭与支持”,“69684”
“54”,“acevedo aaron f”,“警官”,“警察”,“60918”
“14”,“abdollahzadeh ali”,“医护人员”,“火灾”,“64374”
“56”,“acevedo bienvenido”,“警官”,“警察”,“77238”
“28”,“abraham godwin k”,“技师v”,“商务”,“84888”
“58”,“acevedo dailha”,“疾病控制调查员ii”,“健康”,“48108”
“8”,“abbott betty l”,“养祖父母”,“家庭与支持”,“2756”
“60”,“acevedo edwin c”,“消防员”,“消防队”,“83148”
当我在表上运行select时,我可以看到所有100条记录,select count()命令也显示count为100,即表包含100条记录。

employee\u 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;

在根据配置单元事务文档更新employee\u主表时,会创建一个与一行更新相对应的增量文件。更新完以上所有记录后,employee\主表的文件结构如下:

在运行count()和statistics命令时,我仍然看到100条记录作为输出。在表上运行主压缩(手动或自动)之后,我只能看到表中11条记录作为select()命令的输出。意思是,当我从employee\u 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")

然后我没有面对上述问题,但这是不符合我们目前的要求。
我正在使用以下软件版本:
hdp-2.4.0.0-169
Hive1.2.1000
centos 6.8版
在tez客户端上运行配置单元

e0bqpujr

e0bqpujr1#

你不能这样做

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;

这应该很管用。它将正确地填充该表,并且您可以在其上运行更新命令。

zxlwwiss

zxlwwiss2#

是否可以选择将配置单元更新为>=1.3?根据文件:
acid表不支持使用alter table更改架构。hive-11421正在追踪它。固定在1.3.0/2.0.0中。
因为您使用的是Hive1.2.100,并且您正在尝试执行 ALTER TABLE 命令,我认为你遇到的问题与此有关。

相关问题