如何从分区的配置单元表中删除行?

如何解决如何从分区的配置单元表中删除行?

我需要从已分区的 Hive 表中删除特定行。这些要删除的行符合某些条件,因此不能删除整个分区。假设表 Table 有三列:partnerdatesource_key,它由 datesource_key 分区。>

众所周知,hive (See How to delete and update a record in Hive)不支持删除或更新特定记录集的操作。

this solution 之后,我成功地执行了以下查询,以便保留只匹配某些给定条件的记录,例如:属于某个给定的 date 范围,具有source_key='heaven' 和列 partner<>'angel'...

创建表 Table 的临时空副本。

CREATE TABLE IF NOT EXISTS tmpTable LIKE Table;

用当前行填充它。

INSERT OVERWRITE TABLE tmpTable
PARTITION (date,source_key)
SELECT * FROM Table
WHERE
date >= '2020-05-01' AND date < '2020-11-30' AND
source_key = 'heaven';

删除目标分区。

ALTER TABLE Table DROP IF EXISTS
PARTITION (source_key = 'heaven',date >= '2020-05-01',date < '2020-11-30' );

将编辑好的分区插入到目标表中。 (由于语法错误,无法插入 OVERWRITE)

INSERT INTO Table
PARTITION (source_key,date)
SELECT * FROM tmpTable
WHERE
partner <> 'angel';

删除临时表。

DROP TABLE IF EXISTS tmpTable;

查询运行良好。因为表 Table 是管理的,所以当分区被删除时,hdfs 文件应该被删除,但有些错误(可能在最后一个 INSERT INTO 语句中)因为在执行所有这些查询之后目标表 {{ 1}} 保留给定日期范围内带有 Table 的所有记录,带有 ,基本上保持不变。

错在哪里?有什么不见了?对于这样的Hive表,如何准确删除符合特定条件的特定行?

解决方法

表分区可以直接从自身选择+ WHERE 过滤器中覆盖。该场景非常简单,您不需要任何临时表。如果您不确定会发生什么,请制作备份表。

  1. 如果要删除整个分区(而不是覆盖),请执行

    ALTER TABLE TableName DROP IF EXISTS
    PARTITION (<partition spec to be dropped>); --check partition spec to be dropped carefully
    

如果没有要删除的分区,请跳过此步骤。

  1. 用过滤的行覆盖其他分区:

    set hive.exec.dynamic.partition=true;
    set hive.exec.dynamic.partition.mode=nonstrict;
    set hive.allow.move.on.s3=true; --If you are on Qubole/S3
    
    insert overwrite table TableName partition (date,source_key ) --partition spec should match table DDL
    select * from TableName 
     where <condition> --condition should be True for rows which NOT be deleted
    

您的代码相当混乱,因为您使用 LIKE 创建了临时表,但使用了不同的分区规范并选择了 *(与原始表中的列顺序相同)。列的顺序应该完全匹配,分区列是最后一个,也是相同的顺序。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?