我使用的是Serde2 ( Apache模块),它可以使用regex来拆分数据。
我试图编写一个正则表达式来拆分以下数据:
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我怎么才能治好我的Regex?
发布于 2015-02-03 14:51:37
我想这就是你要找的准则:
(.*?)~\\|`(.*?)~\\|`(.*)如果您担心在数据中筛选出除3以外的许多字段,则可以将^和$分别添加到正则表达式的开头和结尾。但是,如果您对数据很有信心,就不需要这样做了。
注意,转义反斜杠本身必须转义,因为这是一个Java字符串。因此,用本地文件中的数据进行测试:
# cat test.data
123~|`sample~|`text
12~|`ss|gs~|`max`s以下是数据反序列化/序列化的方式:
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)我希望这能帮到你。
https://stackoverflow.com/questions/28278682
复制相似问题