前情提要
之前建立过数仓,因为对数据不满意,于是把hdfs上的表全删除,打算从头再创建一次数据。
在执行hdfs_to_ods的脚本时,总是报错Directory xxx could not be cleaned up.
错误原因
之前建立过数仓,hive存储在数据库中的元数据记录了之前数仓的表的结构,比如分区,而在删除hdfs上存储的hive表时,元数据对应的内容并没有删除,所以在第二次同步数据时,hive在覆盖加载分区表时,他以为分区有数据,但却无法清理分区(实际文件已经被删除)而导致的错误
解决办法
在hive中对相关的表使用alter table xxx drop partition(dt='9999-12-31')
因为表比较多,我写了一个shell脚本,各位可以做为参考
#!/bin/bash
参数=$1
dele(){
sql=""
for i in $*; do
sql=$sql"alter table 数据库名.$i drop partition(分区字段='$参数');"#$参数 外不一定要加单引号,我的是日期字段,所以需要加单引号
done
hive -e "$sql"
}
dele "表1" "表2" "表3"
使用方式为
- 在~/bin下
vim 文件名.sh
- 按i进入插入模式,复制代码并修改相应数据
- 按
esc
退出插入模式,输入:wq
后退出文件 - 对文件增加执行权限
chmod +x 文件名.sh
- 执行文件
文件名.sh 参数