正则表达式 :: 如何为配置单元正则表达式 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)
希望对您有所帮助。
我正在使用 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)
希望对您有所帮助。