hive加载json数据解决方案

Posted The-Most-Speial

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hive加载json数据解决方案相关的知识,希望对你有一定的参考价值。

hive官方并不支持json格式的数据加载,默认支持csv格式文件加载,如何在不依赖外部jar包的情况下实现json数据格式解析,本编博客着重介绍此问题解决方案

首先创建元数据表:

create EXTERNAL table access_log (content string) row format delimited fields terminated by \t STORED AS INPUTFORMAT com.hadoop.mapred.DeprecatedLzoTextInputFormat OUTPUTFORMAT org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat location hdfs://sps1:9090/data/accesslog

创建视图表:

create view access_log_view as select eventTime, ip, appName, fp, username, target from access_log lateral view json_tuple(content, "eventTime", "ip", "appName", "fp", "username", "target") t1 as eventTime, ip, appName, fp, username, target;

视图表利用json tuple将json object的数据进行抽取,这样就实现了字段分离。

但是有些日志文件是/user/aaa/dt=2013-12-01/ds=01/access.log带有分区目录的,对于这种格式需要分区表的支持

创建分区表:

create EXTERNAL table access_log (content string) partitioned by (dt int, ds int) row format delimited fields terminated by \t STORED AS INPUTFORMAT com.hadoop.mapred.DeprecatedLzoTextInputFormat OUTPUTFORMAT org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat location hdfs://sps1:9090/data/accesslog4;

但是问题来了,发现没有办法加载数据,该怎么办那。

下一步我们需要手动的加载分区:

alter table access_log add partition(dt=?,ds=?)

这样就可以查到数据了。切记必须要进行分区add,否则无法查到数据。

创建视图表:

与上边创建视图一样

但是分区是随着时间的推移进行增加的,这个不能人肉,我们需要自动化脚本来帮助我们完成

#!/bin/bash
source ~/.bashrc
date=`date +%Y-%m-%d`
hour=`date +%H`
cmd="ALTER TABLE databaseName.tableName ADD PARTITION(dt=‘$date‘, ht=‘$hour‘);"
hive -e "$cmd"

至此为止,有关hive加载json数据和分区表的问题就解释清楚了,不明白下方留言,我们继续讨论。

以上是关于hive加载json数据解决方案的主要内容,如果未能解决你的问题,请参考以下文章

解决未能加载文件或程序集“Newtonsoft.Json ...."或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)(代码片段

hive表加载csv格式数据或者json格式数据

hive 非正确json格式字段造成查询错误

Spark SQL 在不配置 Hive 的情况下加载数据?

异步任务片段背景数据

Json 数据放入 hive 堆大小错误