目录
一、接入JSON格式文件
二、接入mongodb数据
三、接入CSV文件
经常会有接口返回json格式数据,或者json格式日志文件需要接入到hive中
导入相应jar包来序列反序列化(SerDe)来解析json格式
add jar hive-hcatalog-core-0.13.0.jar CREATE external TABLE IF NOT EXISTS schema.table_name ( distinct_id string, lib map< string,string >, properties struct< `$browser`: string, act_id: string >, time bigint ) partitioned by (ds string comment '日期分区,yyyy-MM-dd格式') ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' -- ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' STORED AS TEXTFILE;建表时,不需要写json和表字段的mapping,只需要保持字段名和json对象的key一致即可,顺序无所谓,否则解析出来值为null,所以即使建表时有json中不存在的key也可以,只不过值是null。对于json的key包含特殊字符在建表时加上`符号,例如`$column`、`_id`。
上述org.apache.hive.hcatalog.data.JsonSerDe 不支持忽略格式错误数据和字段映射,所以推荐org.openx.data.jsonserde.JsonSerDe,可参考其官方介绍,下载地址也在其中:https://github.com/rcongiu/Hive-JSON-Serde
但是其中介绍的对于仅仅是大小写不同的两个key可以通过设置
"case.insensitive" = "false", --tells hive to ignore key case来区别,本人实际操作不成功,有清楚的朋友请留言。
两种方式接入
MongoDB-based 直接连接hidden节点,使用 com.mongodb.hadoop.hive.MongoStorageHandler做数据SerDeBSON-based 将数据dump成bson文件,上传到HDFS系统,使用 com.mongodb.hadoop.hive.BSONSerDe参考
https://blog.csdn.net/tonylee0329/article/details/51648524#%E6%95%B0%E6%8D%AE%E5%BA%8F%E5%88%97%E5%8C%96
Hive Usage
其中,建hive表时如果字段名和mongo文件中key值一致可以不用写mapping。
采用bson-based方式注意要导出BSON格式文件,不要导出成JSON格式了,用mongodump命令即可。
注意jar包版本,试过mongo-hadoop-core-1.3.0.jar mongo-hadoop-core-2.0.2.jar mongo-hadoop-hive-1.3.0.jar mongo-hadoop-hive-2.0.2.jar都不行,要么解析过程中内存溢出,要么解析不出复杂结构类型字段值。根据上文用mongo-hadoop-core-1.5.2.jar mongo-hadoop-hive-1.5.2.jar mongo-java-driver-3.2.1.jar是可以的
以上用到的jar包都到maven仓库中去下载就行了,例如:https://mvnrepository.com/artifact/org.mongodb.mongo-hadoop/mongo-hadoop-core/1.5.2
这里的CSV文件除了逗号分隔以外,字段还用双引号括起来了,那么建表erDE时指定解析CSV的SerDe就行了
例如
create table table_name (col1 string, col2 double) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' stored as textfile;