正则表达式 :: 如何为配置单元正则表达式 serde 创建正则表达式

Regex :: How to create regex for hive regex serde

我正在使用 Serde2(Apache Hive 模块),它可以使用正则表达式来拆分数据。
我正在尝试编写一个正则表达式来拆分以下数据:

123~|`sample~|`text
12~|`ss|gs~|`max`s

定界符或字段分隔符是~|`
到目前为止,我想出了这个:

[^(?!^\~\|`$)]*\~\|`[^(?!\~\|`)]**\~\|`[^(?!\~\|`)]* 

但这不起作用。错误信息是:

java.io.IOException:
    org.apache.hadoop.hive.serde2.SerDeException:
        Number of matching groups doesn't match the number of columns

如何修复我的正则表达式?

我认为这就是您正在寻找的正则表达式:

(.*?)~\|`(.*?)~\|`(.*)

如果您担心筛选出数据中可能包含 3 个字段以外的行,您可以在常规字段的开头和结尾添加 ^$分别表达。但是,如果您对自己的数据非常有信心,则不需要这样做。

请注意,转义反斜杠本身必须转义,因为这是一个 Java 字符串。因此,使用本地文件中的数据进行测试:

# cat test.data
123~|`sample~|`text
12~|`ss|gs~|`max`s

这就是您的数据获取方式 de-serialized/serialized:

hive> CREATE TABLE table_name (
    >   first STRING,
    >   second STRING,
    >   third STRING
    > ) 
    >   ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
    >   WITH SERDEPROPERTIES (
    >     "input.regex" = "(.*?)~\|`(.*?)~\|`(.*)",
    >     "output.format.string" = "%1$s %2$s %3$s"
    > );
OK
Time taken: 0.4 seconds
hive> LOAD DATA LOCAL INPATH 'test.data' INTO TABLE table_name;
Copying data from file:test.data
Copying file: file:test.data
Loading data to table default.table_name
Table default.table_name stats: [numFiles=1, numRows=0, totalSize=39, rawDataSize=0]
OK
Time taken: 0.601 seconds
hive> SELECT * FROM table_name;
OK
123 sample  text
12  ss|gs   max`s 
Time taken: 0.382 seconds, Fetched: 2 row(s)

希望对您有所帮助。