首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex ::如何为hive regex serde创建regex

Regex ::如何为hive regex serde创建regex
EN

Stack Overflow用户
提问于 2015-02-02 13:20:04
回答 1查看 2.9K关注 0票数 0

我使用的是Serde2 ( Apache模块),它可以使用regex来拆分数据。

我试图编写一个正则表达式来拆分以下数据:

代码语言:javascript
复制
123~|`sample~|`text
12~|`ss|gs~|`max`s

分隔符或字段分隔符为~|`

到目前为止,我想出了如下结论:

代码语言:javascript
复制
[^(?!^\~\|`$)]*\~\|`[^(?!\~\|`)]**\~\|`[^(?!\~\|`)]* 

但这不管用。错误信息是:

代码语言:javascript
复制
java.io.IOException:
    org.apache.hadoop.hive.serde2.SerDeException:
        Number of matching groups doesn't match the number of columns

我怎么才能治好我的Regex?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-03 14:51:37

我想这就是你要找的准则:

代码语言:javascript
复制
(.*?)~\\|`(.*?)~\\|`(.*)

如果您担心在数据中筛选出除3以外的许多字段,则可以将^$分别添加到正则表达式的开头和结尾。但是,如果您对数据很有信心,就不需要这样做了。

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

代码语言:javascript
复制
# cat test.data
123~|`sample~|`text
12~|`ss|gs~|`max`s

以下是数据反序列化/序列化的方式:

代码语言:javascript
复制
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)

我希望这能帮到你。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28278682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档