问题
- 列的分隔符不固定,一行数据中出现了多种列的分隔符【几乎很少,半结构化数据,跟数据生成格式有关】
name-age,sex phone address
- 列的分隔符固定,但是字段中包含了列的分割符【这种情况会比较多】
2019-08-28 00:03:00 tom
- 解决方案
使用正则加载数据,将非结构化或者半结构化的数据,经过ETL转为结构化数据
实现案例
- 创建数据
vim /export/datas/regex.txt
2019-08-28 00:03:00 tom
2019-08-28 10:00:00 frank
2019-08-28 11:00:00 jack
2019-08-29 00:13:23 tom
2019-08-29 10:00:00 frank
2019-08-30 10:00:00 tom
2019-08-30 12:00:00 jack
- 创建表,加载数据
普通创建
create table logindate1(
longintime string,
name string
)
row format delimited fields terminated by ' ';
load data local inpath '/export/datas/regex.txt' into table logindate1;
select * from logindate1;
- 问题:数据产生了错位,没有按照预想结果产生
- 原因:数据的某个字段中包含了列的分割符
- 解决:Hive运行自定义加载方式,常见的方式:通过正则加载数据
正则加载:
create table logindate2(
longintime string,
name string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "([^}]*) ([^ ]*)"
);
load data local inpath '/export/datas/regex.txt' into table logindate2;
select * from logindate2;