更新配置单

时间:2016-10-23 09:39:36

标签: hive hortonworks-data-platform

我正在尝试将记录更新到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表,如下所示: enter image description here 我从另一个类似的表中加载了100条记录。表中的10个样本记录如下:

  • "雇员""名称"" JOBTITLE""部门"" annualsalary"
  • &#34; 100&#34;,&#34; ADAMCZYK LAWRENCE M&#34;,&#34; FIREFIGHTER&#34;,&#34; FIRE&#34;,&#34; 79926&#34; < / LI>
  • &#34; 52&#34;,&#34; ACCIARI NICHOLAS B&#34;,&#34; MOTOR TRUCK DRIVER&#34;,&#34; STREETS&amp; SAN&#34;&#34; 71469&#34;
  • &#34; 26&#34;,&#34; ABRAHAM DALINA D&#34;,&#34;社区服务&#34;,&#34; FAMILY&amp; SUPPORT&#34;&#34; 69684&#34;
  • &#34; 54&#34;,&#34; ACEVEDO AARON F&#34;,&#34;警察官员&#34;,&#34;警察&#34;,&#34; 60918&#34;
  • &#34; 14&#34;,&#34; ABDOLLAHZADEH ALI&#34;&#34; PARAMEDIC&#34;,&#34; FIRE&#34;,&#34; 64374&#34;
  • &#34; 56&#34;,&#34; ACEVEDO BIENVENIDO&#34;,&#34;警察官员&#34;,&#34;警察&#34;,&#34; 77238&#34; < / LI>
  • &#34; 28&#34;,&#34; ABRAHAM GODWIN K&#34;,&#34; TECHNICIAN V&#34;,&#34; BUSINESS AFFAIRS&#34;,&#34; 84888&#34 ;
  • &#34; 58&#34;,&#34; ACEVEDO DAILHA&#34;,&#34;疾病控制调查员II&#34;,&#34;健康&#34;,&#34; 48108&#34 ;
  • &#34; 8&#34;,&#34; ABBOTT BETTY L&#34;,&#34; FOSTER GRANDPARENT&#34;,&#34; FAMILY&amp; SUPPORT&#34;&#34; 2756&#34;
  • &#34; 60&#34;,&#34; ACEVEDO EDWIN C&#34;,&#34; FIREFIGHTER&#34;,&#34; FIRE&#34;,&#34; 83148&#34; < / LI>

当我在桌面上运行select *时,我可以看到所有100条记录,并选择count(*)命令也显示count为100,即表包含100条记录。

enter image description here

employee_master表的目录结构如下所示: enter image description here

现在,我想使用以下查询逐个更新上述示例记录中的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表的文件结构如下所示:enter image description here

在运行count()和statistics命令时,我仍然看到100条记录作为输出。 在主要压缩(在表上有条理地或自动地)运行之后,我只能看到表中的11条记录作为select()命令的输出。意思是,当我从employee_master运行select()时,我只能看到11条记录,而这是不正确的。在更新表格之前,输出应显示所有100条记录; enter image description here 运行count()和statistics命令时如下;将计数显示为100条记录如下:

enter image description here

我在不同的表/服务器上以相同的方式多次尝试过这个练习,但都显示出相同的意外输出。不确定我是否遗漏了某些东西,或者这是一个错误。

注意:我尝试使用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客户端上运行配置单元

2 个答案:

答案 0 :(得分:1)

将Hive更新为&gt; = 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;

这应该工作得很好。它将正确填充表格,您将能够在其上运行更新命令。