问题:当phoenix 数据数据很大(5年以上数据),删除phoenix数据时,不添加主键delete 语句会报错(delete 会触发hbase合并文件),下面介绍一种方法实现phoenix 大表数据删除
思路:编写sql 拼接phoenix表主键,生成delete 语句
ps:
- phoenix数据 hive表中需要存在一份
- 当phoenix表比较少,直接执行delete语句即可
操作步骤
1. 确认hbase表主键和同步的hive表
hbase表:apex.his_jy_zqye ,主键 khh、rq、gtlb、jys、zqdm、gdh
hive映射表:adp_dm.ids_his_jy_zqye_impala_hb 确认 rq 是要删除的日期


ps: 5年以上的数据,只写 delete from apex.his_jy_zqye where rq = '20231225' 会报错,拼接成带有主键的删除语句即可 delete from apex.his_jy_zqye where rq = '20231225' and khh = '12345678' and zqdm = '000001'
2. 开发删除脚本
select concat ("delete from apex.his_jy_zqye where khh ='",khh,"' and rq = '20231225' and zqdm = '",zqdm, "' ;") as del_sql from adp_dm.adp_dm.ids_his_jy_zqye_impala_hb where rq = 20231225 ;
使用impala-shell 命令把文件导出为本地 csv文件
impala-shell -q "SELECT * FROM your_table;" > output.csv
sed命令删除多余内容
如:sed -i 's/|//g' output.csv

3. 检查生成的脚本,执行删除语句
知识补充
sed 命令
1、要使用 sed 将字符串中的 | 符号替换为空(即删除它),你可以使用以下命令:
echo "your|string|here" | sed 's/|//g'
#结果:yourstringhere
解释:
s: 表示替换操作。|: 是正则表达式中的特殊字符,表示“或”。为了在正则表达式中使用普通的|符号,我们需要对它进行转义,即使用\|。//: 表示替换为的字符串,这里我们用空字符串表示删除。g: 表示全局替换,即替换每一行中的所有匹配项。
2、要在 shell 脚本中删除空行,您可以使用 sed 命令。以下是一个示例:
sed -i '/^$/d' input.sh
解释一下这个命令的各个部分:
-
sed是一个流编辑器,用于对输入流(文件或管道)进行基本的文本转换。 -
'/^$/d'是一个sed命令,其中:/^$/是一个正则表达式,匹配空行。d表示删除匹配的行。
当Phoenix数据量巨大时,直接删除会引发错误。本文介绍了如何通过编写SQL拼接主键,生成删除脚本来安全删除数据。操作步骤包括确认HBase表主键和Hive映射表,开发删除脚本,以及使用sed命令处理脚本执行删除。

3925





