Hive - 爆炸和聚合计数?

问题描述

我有一个 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