【问题标题】:split a file path into its constituent paths in Hive/Presto在 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

谁能帮帮我。

【问题讨论】:

标签: string split hive hiveql presto


【解决方案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);
    猜你喜欢
    • 1970-01-01
    • 2011-03-11
    • 2020-08-04
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 2012-05-17
    • 1970-01-01
    相关资源
    最近更新 更多