Hive : 当列值由分隔符 (~) 分隔时,将单个记录扩展为多个记录

Posted

技术标签:

【中文标题】Hive : 当列值由分隔符 (~) 分隔时,将单个记录扩展为多个记录【英文标题】:Hive : Expand a single record into multiple records when column values are separated by delimiter (~) 【发布时间】:2019-11-07 17:13:32 【问题描述】:

我有以下信息

id     user                 date                          test

102   123~456~897   01JAN2019~6JUL2018~21DEC2017        abc~qwer~~wer~
103  13~45~88~34   01JAN2020~6JUN2019~21JAN2018~12MAR2017 pqr~~qw~wer*123~qwerty

我需要的结果,记录必须按升序展开。

id      user     date            test 

102     897      21DEC2017        wer
102     456      06JUL2018        qwer
102     123      01JAN2019        abc
103     34       12MAR2017        qwerty
103     88       21JAN2018        wer*123
103     45       06JUN2019        qw
103     13       01JAN2020        pqr

我尝试使用横向视图poseexplode,但它无法正常工作,请帮助。

a.id, 
    from demo a
    lateral view posexplode(a.test,'\\~')) t1 as exploded_test,test
    lateral view posexplode(a.user,'\\~')) t2 as exploded_user, user
    lateral view posexplode(a.date,'\\~')) t3 as exploded_date, date
    where exploded_test == exploded_user and exploded_user == exploded_date
    order by 1,3

【问题讨论】:

你能格式化你的数据来理解问题吗?我的理解是您有 3 个输入行,如果可能的话,您可以根据分隔符将输入行分解为列,然后格式化您想要的输出吗? 已尽力格式化,谁能给我提示如何正确格式化,谢谢 【参考方案1】:

波浪号 (~) 不是 Java 正则表达式中的元字符(Hive 使用 Java 正则表达式),不需要转义。还可以将posexplode 或explode 应用于数组,您需要在分解之前拆分字符串以获取数组。使用posexplode(split(a.user,'~+')) t1 as (pos,user)

另外(这只是一个意见):我不会将数组位置命名为“exploded_test”。 posposition 或简单的 p 看起来不会那么混乱

【讨论】:

谢谢,但在我上面的问题中,有多个 ~ 分隔值,我想忽略 ~ 的多次出现,只考虑 ~ 的单次出现。是否有可能通过poseexplode实现这一目标 @shanmukh 根据问题中的预期结果,我相信您正在尝试将多个波浪号视为单个波浪号并由它分割,对吗?然后在正则表达式中使用'~+',意思是:一个或多个波浪号。编辑了答案

以上是关于Hive : 当列值由分隔符 (~) 分隔时,将单个记录扩展为多个记录的主要内容,如果未能解决你的问题,请参考以下文章

Hive load外部文件时如何区别分隔符与文本内容

hive load数据时如何设定为分隔符?

当列值匹配时,Pandas Dataframe 从一行中替换 Nan

当列值是 84 字节文本字段时,postgres 中保持列唯一的最有效方法是啥?

当列值更改时,如何将组号添加到 SQL Server 2012 中的顺序记录?

ExtJS 4 - 当列编辑器是组合框时如何避免网格列值变为空?