【问题标题】:Insert overwrite partition in Hive table - Values getting duplicated在 Hive 表中插入覆盖分区 - 值重复
【发布时间】:2015-01-10 06:01:38
【问题描述】:

我用 Non-partition 表创建了一个 Hive 表,并使用选择查询将数据插入到 Partitioned Hive 表中。

Refered site

  1. 通过上面的链接,我的分区表包含重复值。以下是设置

这是我的示例员工数据集:link1

我尝试了以下查询:link2

但在更新 Hive 表中的值后,

将 EmployeeID 为 19 的 Steven 的工资更新为 50000。

插入覆盖表 Unm_Parti_Trail 分区(部门 = 'A') SELECT employeeid,firstname,designation, CASE WHEN employeeid=19 THEN 50000 ELSE 工资 END AS 工资 FROM Unm_Parti_Trail;

值正在重复。

7       Nirmal  Tech    12000   A
7       Nirmal  Tech    12000   B

Nirmal 仅放置在部门 A,但会复制到部门 B

我做错了什么吗?

请提出建议。

【问题讨论】:

  • 似乎在您第一次插入新表时,所有行都被选中。 SELECT EmployeeID, FirstName,Designation,Salary FROM Unm_Dup_Parti_Trail WHERE department='A' 是什么意思?返回?
  • @kabamaru:返回9条记录,不重复
  • 尝试同时选择您选择的部门字段,看看这是否适合您。例如:SELECT EmployeeID, FirstName,Designation,Salary, Department FROM Unm_Dup_Parti_Trail WHERE department='A';
  • Unm_Dup_Parti_Trail 表不包含任何重复项,重复项在分区表中 Unm_Parti_Trail.Unm_Dup_Parti_Trail 表是为了将数据加载到分区表中而创建的。我按照上面的链接进行操作。不知道它是否正确。
  • @kabamaru:这是我引用的链接blog.safaribooksonline.com/2012/12/03/…

标签: hadoop hive external


【解决方案1】:

您似乎忘记了上次 INSERT OVERWRITE 中的 WHERE 子句:

INSERT INTO TABLE Unm_Parti_Trail PARTITION (Department = 'A') 
SELECT employeeid,firstname,designation, CASE WHEN employeeid=19 
THEN 50000 ELSE salary END AS salary FROM Unm_Parti_Trail 
WHERE department = 'A';

【讨论】:

  • Insert Overwrite 会删除整个 Dept A,然后只插入我们正在更新的一条记录。插入就可以了。看到这个帖子:unmeshasreeveni.blogspot.in/2014/11/…
  • @sfotiadis,您错过了在查询中选择分区列。
【解决方案2】:

一种可能的解决方案。

当您执行插入时,需要选择分区字段作为查询中的最后一个。例如:

INSERT INTO TABLE Unm_Parti_Trail PARTITION(department='A') 
SELECT EmployeeID, FirstName,Designation,Salary, Department 
FROM Unm_Dup_Parti_Trail
WHERE department='A';

查看此link了解更多信息。

【讨论】:

  • 是的,很抱歉,我认为这并不令人困惑。我已经更新了答案。
  • 但是如果我们按照您的建议进行上述查询,它会显示“FAILED: SemanticException [Error 10044]: Line 1:18 Cannot insert into target table because column number/types are different ''A'' : 表 insclause-0 有 4 列,但查询有 5 列。”。我们不需要将部门连同我们的选择声明一起提供。并且您提供的链接仅解释了插入而不是更新语句
  • 嗯,是的,你在写。它可能指的是早期版本的 hive。您使用的是哪个蜂巢版本?您能否在四个插入中的每一个之后将决赛桌的内容放入另一个粘贴箱?
  • 谢谢它成功了。我们需要插入而不是覆盖覆盖,我也错过了一个 where 类
  • 不错。我注意到 WHERE 子句也丢失了,请参阅下面我提出的其他解决方案。如果您认为它解决了问题,您可以接受。
猜你喜欢
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多