java - hive serde 中多分隔符字符串的正则表达式

标签 java regex hive

我使用serde读取带有分隔符||的特定格式的数据,像|||这样的三重管道永远不会出现在我的数据字符串中。

我的一行数据可能看起来像:aaa||bbb||ccc||ddd,我创建了如下的配置单元表:

CREATE TABLE test_log(
host STRING,
identity STRING,
user STRING,
time STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "([^\\|]*)\\|{2}([^\\|]*)\\|{2}([^\\|]*)\\|{2}([^\\|]*)",
"output.format.string" = "%1$s %2$s %3$s %4$s")
STORED AS TEXTFILE;

读取数据似乎没问题,但显然,当面对一些数据时,input.regex并不完全正确:a|bc||edf||g|g| |ghi。我尝试在《掌握正则表达式》一书中寻求帮助,但没有成功。

是否可以仅使用特定的input.regex读取和提取上述格式的数据?

最佳答案

现在,您仅捕获由管道对分隔的组,但不包含管道字符本身:([^\\|]*)。如果将其更改为 ((?:[^\\|]+\\|)*[^\\|]+) 那么每个组将能够在中间某处包含单个管道(如 a|bcgg|g),但不允许以管道开始或结束,因为这会导致歧义(例如:ab|||cd 可以分为 ab|cdab|cd)。

关于java - hive serde 中多分隔符字符串的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8464995/

相关文章:

java - 如何在不推荐使用 tabhost 的情况下实现 Android 选项卡菜单

java - android studio(java) 使用字符串查找 View id

javascript - 如何分割正则表达式空间和标点符号匹配,但将标点符号保留在结果数组中?

Java 正则表达式 [a-z] 也匹配数字和大写字母

hadoop - 从 Hue UI 执行的 Oozie 中的 Hive 操作失败

java - 获取连接到特定节点的所有节点的索引

java - Android 应用程序 - 可以修改 Constants.java 中的字符串吗?

regex - 如何捕获此正则表达式中的最后两个字符?

database - 以批处理模式将配置单元传递给 createTables.hql

sql - 在 Hive 中获取查询输出的模式