问题描述
我有一个 hive 表,用于存储驱动器到叶节点的路径,以及它有多少文件。并且想要建立一个新的hive表,可以查询任何文件夹深度下存在多少文件。我可以获得一些有关如何实现这一目标的提示吗?
我的输入表是:
>select * from default.file_file
path file_count
/teamA/projectA/ 3
/teamA/projectB/ 2
我正在尝试构建输出表,使其看起来像:
>select * from default.output_table
path file_count
/ 5
/teamA/ 5
/teamA/projectA/ 3
/teamA/projectB/ 2
到目前为止,我尝试了lateral_view + explode 方法,但这不允许我跟踪目录层次结构(每个 /
存储在单独的行中)。
解决方法
可以拆分路径,然后使用运行 collect_set 解析函数 + concat_ws 再次构建路径。在这个按路径聚合 file_count 组之后:
演示:
SELECT stack (2,'/teamA/projectA/',3,'/teamA/projectB/',2
) AS (path,file_count)
)
select path,sum(file_count) file_count
from
(
select t.file_count,concat(concat_ws('/',collect_set(s.node) over(partition by t.path order by level)),'/'
) path
from Table1 t
--remove trailing /,split and explode
lateral view posexplode(split(regexp_replace(t.path,'/$',''),'/')) s as level,node
)s
group by path;
结果:
path file_count
/ 5
/teamA/ 5
/teamA/projectA/ 3
/teamA/projectB/ 2