在 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 中将文件路径拆分为其组成路径的主要内容,如果未能解决你的问题,请参考以下文章

Impala,Presto和Hive在MR3上的性能评估

Athena (Hive/Presto) Parquet vs ORC 计数查询

如何在 Amazon EMR 上将连接器添加到 presto

如何在java中将Wav文件拆分为通道?

Python DearPyGui 常用控件一

在Javascript中将PDF拆分为单独的文件