【问题标题】:Regex for pipe delimited data in HiveHive 中管道分隔数据的正则表达式
【发布时间】:2014-05-31 07:13:25
【问题描述】:

我需要为管道分隔的数据构造一个 Hive SerDe RegEx。

样本数据:

CEF:0|微软|微软 Windows||Microsoft-Windows-Security-Auditing:434|帐户已记录 关闭。|低| eventId=260 externalId=44 msg=网络:用户或计算机 从网络登录到这台计算机。 categorySignificance=/信息类别行为=/访问/停止 categoryDe​​viceGroup=/操作系统 catdt=操作系统 categoryOutcome=/成功 categoryObject=/Host/Operating|Vista ad.EventIndex=-972 ad.WindowsParserFamily=Windows 2008 R2|2008|7|Vista ad.WindowsVersion=Windows 服务器

为此,我们需要通过管道将前七列分开,并将之后的所有内容视为一列。

DDL:(CEF STRING、供应商 STRING、产品 STRING、版本 STRING、签名 STRING、名称 STRING、严重性 STRING、扩展 STRING)

因此,样本数据输出应映射到列,如下所示: Col1:CEF:0 Col2:微软 Col3:微软视窗 Col4: Col5:Microsoft-Windows-安全-审计:434 Col6:帐户已注销。 Col7:低 Col8: eventId=260 externalId=44 msg=Network: 用户或计算机从网络登录到这台计算机。 categorySignificance=/信息 categoryBehavior=/访问/停止 categoryDe​​viceGroup=/操作系统 catdt=操作系统 categoryOutcome=/成功 categoryObject=/Host/Operating|Vista ad.EventIndex=-972 ad.WindowsParserFamily=Windows 2008 R2|2008|7|Vista ad.WindowsVersion=Windows 服务器

input.regex 应该是什么?

还可以使用此 Regex 为 (key=value) 格式的列提供 Map 数据类型吗?

【问题讨论】:

  • 请先生输出样本!
  • 你的代码哪里出错了?
  • @aelor 添加了示例数据的预期输出。

标签: regex hive


【解决方案1】:

我没有使用 hive 的经验,但是查看一些示例,input.regex 的以下值应该可以工作:

([^\\|]*)\\|([^\\|]*)\\|([^\\|]*)\\|([^\\|]*)\\|([^\\|]*)\\|([^\\|]*)\\|([^\\|]*)\\|(.*)

您可能需要配置output.format.string。也许以下链接有帮助:

【讨论】:

  • 很好的答案,但对于那些阅读您的答案的人来说,请注意:OP 没有提及,但 CEF 允许转义管道 \|在标题的管道分隔部分内(这有多聪明?)并且您的正则表达式似乎不适合这一点......例如9 月 19 日 08:26:10 主机 CEF:0|security|threatmanager|1.0|100|检测到 \|在消息中|10|src=10.0.0.1 act=blocked a | dst=1.1.1.1
  • 我还在 Java 中创建了一个 CEF 解析器,这样人们就不会再受苦于从地狱中解析这种格式了。 :-) github.com/fluenda/ParCEFone
猜你喜欢
  • 1970-01-01
  • 2018-06-12
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多