如题:
进来项目中需要用hive表将csv文件导入一个表中,具体怎么导的可以参照我另一篇文章Hive将csv文件导入表
话不多说,回归今日正题,因为我遇到了这样一种情况,就是酱紫的数据(只挑出来一条中的这几个特殊字段吧):
“序号:1,驱动电机状态:耗电,驱动电机控制器温度:29,驱动电机转速:15.0,驱动电机转矩:584.0,驱动电机温度:25,电机控制器输入电压:338.0,电机控制器直流母线电流:4.6”,
1,
,
“序号:1,温度探针总数:12,温度可充电储能子系统个数:1”,
“序号:1,可充电储能装置电流:13.1,单体电池总数:96,本帧单体电池总数:96,可充电储能装置电压:338.5,电压可充电储能子系统个数:1”,
“[{”“currentcharging_device_current”":"“13.1"”,"“frameNum”":"“1"”,"“totalCells”":"“96"”,"“units”":""[{"“value”":"“3.526"”},{"“value”":"“3.527"”},{"“value”":"“3.527"”},{"“value”":"“3.527"”},{"“value”":"“3.528"”},{"“value”":"“3.528"”},{"“value”":"“3.528"”},{"“value”":"“3.528"”},{"“value”":"“3.527"”},{"“value”":"“3.526"”},{"“value”":"“3.527"”},{"“value”":"“3.527"”},{"“value”":"“3.526"”},{"“value”":"“3.526"”},{"“value”":"“3.527"”},{"“value”":"“3.525"”},{"“value”":"“3.522"”},{"“value”":"“3.519"”},{"“value”":"“3.521"”},{"“value”":"“3.522"”},{"“value”":"“3.523"”},{"“value”":"“3.521"”},{"“value”":"“3.524"”},{"“value”":"“3.522"”},{"“value”":"“3.523"”},{"“value”":"“3.522"”},{"“value”":"“3.523"”},{"“value”":"“3.522"”},{"“value”":"“3.522"”},{"“value”":"“3.522"”},{"“value”":"“3.523"”},{"“value”":"“3.521"”},{"“value”":"“3.521"”},{"“value”":"“3.516"”},{"“value”":"“3.516"”},{"“value”":"“3.516"”},{"“value”":"“3.516"”},{"“value”":"“3.515"”},{"“value”":"“3.521"”},{"“value”":"“3.520"”},{"“value”":"“3.517"”},{"“value”":"“3.521"”},{"“value”":"“3.517"”},{"“value”":"“3.521"”},{"“value”":"“3.519"”},{"“value”":"“3.521"”},{"“value”":"“3.521"”},{"“value”":"“3.518"”},{"“value”":"“3.521"”},{"“value”":"“3.522"”},{"“value”":"“3.522"”},{"“value”":"“3.522"”},{"“value”":"“3.522"”},{"“value”":"“3.521"”},{"“value”":"“3.519"”},{"“value”":"“3.522"”},{"“value”":"“3.522"”},{"“value”":"“3.518"”},{"“value”":"“3.522"”},{"“value”":"“3.520"”},{"“value”":"“3.522"”},{"“value”":"“3.517"”},{"“value”":"“3.518"”},{"“value”":"“3.519"”},{"“value”":"“3.521"”},{"“value”":"“3.521"”},{"“value”":"“3.516"”},{"“value”":"“3.520"”},{"“value”":"“3.521"”},{"“value”":"“3.521"”},{"“value”":"“3.520"”},{"“value”":"“3.519"”},{"“value”":"“3.519"”},{"“value”":"“3.519"”},{"“value”":"“3.520"”},{"“value”":"“3.519"”},{"“value”":"“3.520"”},{"“value”":"“3.520"”},{"“value”":"“3.521"”},{"“value”":"“3.518"”},{"“value”":"“3.522"”},{"“value”":"“3.518"”},{"“value”":"“3.520"”},{"“value”":"“3.518"”},{"“value”":"“3.519"”},{"“value”":"“3.522"”},{"“value”":"“3.518"”},{"“value”":"“3.522"”},{"“value”":"“3.522"”},{"“value”":"“3.520"”},{"“value”":"“3.521"”},{"“value”":"“3.521"”},{"“value”":"“3.521"”},{"“value”":"“3.521"”},{"“value”":"“3.521"”},{"“value”":"“3.520"”}]"","“vol_package”":"“1"”,"“voltage”":"“338.5"”}]",
“[{”“tem_package”":"“1"”,"“totalPBProbes”":"“12"”,"“units”":""[{"“value”":"“25.000"”},{"“value”":"“25.000"”},{"“value”":"“25.000"”},{"“value”":"“24.000"”},{"“value”":"“25.000"”},{"“value”":"“24.000"”},{"“value”":"“25.000"”},{"“value”":"“25.000"”},{"“value”":"“24.000"”},{"“value”":"“24.000"”},{"“value”":"“25.000"”},{"“value”":"“24.000"”}]""}]",
每个字段我给分开了,我们知道hive里面有个
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
就是按特殊字符分割的(一般是以逗号分割),很显然碰到以上的数据按逗号分割就有点问题了,因为数据里面也有逗号,hive会把一个字段里面的逗号也去分割,这就会造成一个字段可能被拆成几个导致数据不全而且字段也对不上,怎么办呢?
1,更改数据结构
首先最简单的肯定是让别人搞定这个事了?让生产数据的更改数据结构,找个唯一标识符来当作分割字段的特殊字符。比如用#号或者其他。
2,设置hive的Serde,在Hive1.1版本中提供了多种Serde,此处的数据通过属于CSV格式,所以这里使用默认的org.apache.hadoop.hive.serde2.OpenCSVSerde类进行处理。经过修改后的建表语句如下:
CREATE EXTERNAL TABLE IF NOT EXISTS `lyb`(
`code` string COMMENT 'import id',
`vin` string COMMENT 'import name',
`vichel` string COMMENT 'import message',
`test1` string COMMENT 'data test1',
`test2` string COMMENT 'data test2',
`test3` string COMMENT 'data test3'
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
"separatorChar" = ",",
"quoteChar" = "\"",
"escapeChar" = "\\"
)
stored as textfile
LOCATION 's3://volvo-region-emr-test/lyb/llltest'
tblproperties("skip.header.line.count"="1")
;
结果就是这样的,不会再将字段给分割了(我只是挑出来几个特殊数据去当例子,有普通的,有字符串里面有逗号没双引号的,也有字符串里面是数组、json的,不过最后一个字段数据有点多。。。。。)
赶紧去试试吧。