【问题标题】:regexp_extract get all matchesregexp_extract 获取所有匹配项
【发布时间】:2018-03-13 23:17:57
【问题描述】:

我正在查询hive 中的列。 此列包含json 有效负载,格式如下:

{"aaa":"xxx", "status":"yes", "bbb":"xyx", "ccc":"yxy", "status":"no", "status":"maybe", "ddd":"zyz"}

我正在尝试提取出现在有效负载不同点的所有状态值。 我正在使用以下内容:

select regexp_extract (payload,'(?<=status":")(.*?)"') as Status

然而,这只会返回第一次出现的状态,而下一次则全部丢失。每次重复状态后如何获取值?

谢谢

【问题讨论】:

  • 尝试regexp_extract_all 以获得全球影响。
  • 谢谢。我试过了,但它说 regexp_extract_all 不是一个公认的函数 - 也许 Hive 不使用它:(
  • 你的预期输出是什么?
  • 理想情况下,我可以将所有“状态”值提取为单独的单元格或一个长字符串,然后我可以将它们分开!所以像“是”“不”“也许”之类的东西

标签: regex hive extract


【解决方案1】:

使用REGEXP_REPLACE、SPLIT,EXPLODE 和get_json_object() 的组合

SELECT *
FROM (
    SELECT get_json_object(r, '$.status') AS STATUS
    FROM yourtable t 
     LATERAL VIEW explode(split(regexp_replace(t.payload, ',', '},{'), ',')) t1 AS r
    ) a
WHERE STATUS IS NOT NULL;

这给了

status
yes
no
maybe

【讨论】:

  • 非常感谢!这行得通!我的 json 格式错误,最初 get_json_object 没有工作,但我能够清理它并使其工作!再次感谢!
  • @Valerie:不客气。请阅读:stackoverflow.com/help/someone-answers
  • 我们可以通过regexp_extract函数得到答案吗?顺便说一句,就像在问题中所做的那样
【解决方案2】:

我猜你这样做是因为 json 格式错误,包含重复的键。

使用除[^abc] 符号之外的任何东西的正则表达式:

/"status":"([^"]*)"/g

如果您只想要包含值的条目,这也会从“status”:“”中收集空字符串:

/"status":"([^"]+)"/g

原始和最佳的正则表达式参考当然是 perldoc perlre : https://perldoc.perl.org/perlre.html

【讨论】:

  • 感谢您的回复。我尝试了这种语法,但它没有返回任何值:select regexp_extract (payload,'/"status":"([^"]+)"/g')。它只返回“”。我是否在查询中包含了您的建议错误? 我对正则表达式很陌生,由于stackoverflow问题,我只在我的选择查询中提出了这个逻辑,所以如果我做了一些愚蠢的事情,请多多包涵!!!!我有这个具有不同数据层次结构的json并且“状态”在有效负载的不同级别中重复,并试图“扁平化”数据并提取层次结构所有级别的所有状态。
  • 使用 regexp_extract_all,去掉斜线和 g 标志。
  • SemanticException [Error 10011]: Line 1:7 Invalid function 'regexp_extract_all' - 我正在使用 Hortonworks,显然不喜欢 'regext_extract_all' 函数 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多