如何使用正则表达式serde将文件中的“::”作为分隔符

3
我有一个数据集,其中使用双冒号 (::) 作为分隔符。如何在Hive中使用正则表达式serde来解析数据,以便可以将其导入到表中?
数据结构如下:
userId::movieId::rating::time

当前我正在使用这个查询语句,但对于选择语句却返回空值:

create table rating_regex(userId string,movieId string,rating string,time string) row format serde 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' with serdeproperties(
"input.regex" = "::"
  ) stored as textfile
2个回答

5
您需要为整个记录创建完整的正则表达式,然后声明输出格式。
例如:
CREATE TABLE rating_regex(
  userId string,
  movieId string,
  rating string,
  time string) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' 
WITH serdeproperties("input.regex" = "(.+)::(.+)::(.+)::(.+)",
"output.format.string" = "%1$s %2$s %3$s %4$s")
STORED AS TEXTFILE;

非常感谢JamCon,祝贺你们达成了1K。 - agarwal_achhnera

1

这是对之前优秀答案的补充。如果您的输入文件中有多个分隔符,您还可以使用multidelimitserde。

假设您想将下面的输入文件加载到Hive表中。

userId::movieId::rating::time
1111::Rambo::one::2016-01-04 00:12:06


CREATE EXTERNAL TABLE IF NOT EXISTS  UDB.movie_rating (
 userId        VARCHAR(10)
,movieId       VARCHAR(20) 
,rating        VARCHAR(5) 
,movietime     timestamp
)
comment 'This table will contain movie rating information.'
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe'
WITH SERDEPROPERTIES ("field.delim"="::")
LOCATION '/hdfspathlocation/MULTISERDE'
tblproperties ("skip.header.line.count"="1")
;

select * from UDB.movie_rating;

+---------+----------+---------+------------------------+--+
| userid  | movieid  | rating  |       movietime        |
+---------+----------+---------+------------------------+--+
| 1111    | Rambo    | one     | 2016-01-04 00:12:06.0  |
+---------+----------+---------+------------------------+--+

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接