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”。 pos
或 position
或简单的 p
看起来不会那么混乱
【讨论】:
谢谢,但在我上面的问题中,有多个 ~ 分隔值,我想忽略 ~ 的多次出现,只考虑 ~ 的单次出现。是否有可能通过poseexplode实现这一目标 @shanmukh 根据问题中的预期结果,我相信您正在尝试将多个波浪号视为单个波浪号并由它分割,对吗?然后在正则表达式中使用'~+'
,意思是:一个或多个波浪号。编辑了答案以上是关于Hive : 当列值由分隔符 (~) 分隔时,将单个记录扩展为多个记录的主要内容,如果未能解决你的问题,请参考以下文章
当列值匹配时,Pandas Dataframe 从一行中替换 Nan
当列值是 84 字节文本字段时,postgres 中保持列唯一的最有效方法是啥?