在hive/presto中,将一个文件路径分割成不同的路径

h5qlskok  于 2021-04-09  发布在  Hive
关注(0)|答案(2)|浏览(977)

使用 xxrestxpo/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

谁能帮帮我。

j5fpnvbx

j5fpnvbx1#

这可以做的工作。

SELECT item, array_join( array_agg(item) over (order by id), '\' )
FROM UNNEST(split('\Users\Killer\Downloads\Temp','\')) WITH ORDINALITY t(item,id)

explanation:
首先,我们用delimeter将sting分割成一个数组,然后将这个数组 "UNNEST "成行,每行为一个项目。之后,我们对所有项目进行 "array_agg",直到这个行的id("滚动 "聚合窗口功能),最后我们用delimeter将它们 "array_join "回来。

pbwdgjma

pbwdgjma2#

分割得到数组,使用posexplode爆炸数组,再次使用分析函数收集数组,然后连接(字面上的/应该用多一个反斜线-/屏蔽,在分割时使用的regex中,单个反斜线表示为四个反斜线)。

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

相关问题