在 Hive/Presto 中将文件路径拆分为其组成路径
Posted
技术标签:
【中文标题】在 Hive/Presto 中将文件路径拆分为其组成路径【英文标题】:split a file path into its constituent paths in Hive/Presto 【发布时间】:2020-11-09 07:14:29 【问题描述】:使用 Presto/Hive,我想按以下方式拆分字符串。
输入字符串:
\Users\Killer\Downloads\Temp
\Users\Killer\Downloads\welcome
并让查询返回这些行:
\Users\
\Users\Killer\
\Users\Killer\Downloads\
\Users\Killer\Downloads\Temp
\Users\
\Users\Killer\
\Users\Killer\Downloads\
\Users\Killer\Downloads\welcome
谁能帮帮我。
【问题讨论】:
你肯定需要UNNEST
加上一些array functions 和string functions。到目前为止,您尝试过什么?
【参考方案1】:
Hive 解决方案。拆分以获取数组,使用poseexplode分解数组,使用解析函数再次收集数组并连接(文字\
应该用一个反斜杠-\\
屏蔽,并且在拆分中使用的正则表达式中,单个反斜杠表示为四个反斜杠):
select s.level,
concat(concat_ws('\\',collect_set(s.path) over(order by level rows between unbounded preceding and current row)),
case when level<size(split(t.str,'\\\\'))-1 then '\\' else '' end
) result
from mytable t lateral view posexplode(split(t.str,'\\\\')) s as level, path
结果:
level result
0 \
1 \Users\
2 \Users\Killer\
3 \Users\Killer\Downloads\
4 \Users\Killer\Downloads\Temp
【讨论】:
【参考方案2】:这可以完成工作:
SELECT item, array_join( array_agg(item) over (order by id), '\' )
FROM UNNEST(split('\Users\Killer\Downloads\Temp','\')) WITH ORDINALITY t(item,id)
说明:
我们首先将split
的字符串通过分隔符\
指向一个数组,然后我们将UNNEST
这个数组分成几行,每个项目一行。之后,我们对所有项目执行 array_agg
直到此行 id(窗口函数的“滚动”聚合),最后我们 array_join
使用 \
分隔符返回它们。
【讨论】:
我正在运行以下查询,但结果将永远进入循环我正在处理数百万条记录 SELECT fsiamge.id, array_join(array_agg(item) over (order by id,level) ,'/') FROM fsiamge CROSS JOIN UNNEST(split(id,'/')) WITH ORDINALITY t(item,level);以上是关于在 Hive/Presto 中将文件路径拆分为其组成路径的主要内容,如果未能解决你的问题,请参考以下文章
Athena (Hive/Presto) Parquet vs ORC 计数查询