首先,Hive事务表所产生的的路径信息如下:
PS:其中路径信息格式为
bash
/user/hive/warehouse/${database_name}.db/${table_name}/*
bash
/user/hive/warehouse/test.db/tran_ts/delete_delta_0000002_0000002_0000
/user/hive/warehouse/test.db/tran_ts/delta_0000001_0000001_0000
/user/hive/warehouse/test.db/tran_ts/delta_0000002_0000002_0000
然后,需求为:我们需要分库表统计目录数量。
接下来,拆分需求:
- 获取最后一个子目录名
- 截取字符串到最后一个'/'前的路径信息
因为hive没有获取第几个字符的相关UDF函数,所以只能通过多个函数组合的方式进行处理。结果如下:
sql
select location,
substr(location, 1, length(location) - length(split(reverse(location), '/')[0]) - 1) as db_table_path,
reverse(split(reverse(location), '/')[0]) as last_subpath_name
from
(
select "/user/hive/warehouse/test.db/tran_ts/delete_delta_0000002_0000002_0000" as location
) t
解析:
- reverse(location):反转字符串
- split(reverse(location), '/')[0]:反转并分隔字符串,获取字符串数组第一个字符串
- reverse(split(reverse(location), '/')[0]):反转上述获取到的字符串,得到最后一个子目录名
- length(location):获取路径字符串长度
- length(location) - length(split(reverse(location), '/')[0]) - 1:获取待截取字符串长度,即总长度-最后一个子目录名长度
- substr(字符串,截取字符串起始位置,截取字符串长度):进行字符串截取