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,否则无法查到数据。

批量add分区方法:

#!/bin/bash
source ~/.bashrc
dir="/testdata/user"
dt="dt="
ht="ht="
table="tpa.access_log"
hscript=""
#get date dir list
for part in `hadoop fs -ls $dir |grep -o -P "[0-9-]+$"`;
do
#get hour dir list
for part2 in `hadoop fs -ls $dir/$dt$part |grep -o -P "[0-9]+$"`
do
echo $dir/$dt$part/$ht$part2
tmp="ALTER TABLE $table ADD PARTITION($dt'$part', $ht'$part2');"
hscript=$hscript$tmp
done;
done; hive -e "$hscript"

创建视图表:

与上边创建视图一样

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

#!/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数据解决方案的更多相关文章

  1. dojo 加载Json数据

    1.今天研究了dojo datagrid加载WebService后台传上来的数据.研究来研究去发现他不是很难.用谷歌多调试一下就好了. 2.看很多例子,这个例子能够更好的帮我解决问题:https:// ...

  2. 扩展JQUERY 表单加载JSON数据

    $.fn.extend({ //表单加载json对象数据 setForm : function (jsonValue) { var obj = this; $.each(jsonValue, func ...

  3. PHP+MySQL+Easyui tree菜单从后台加载json数据(一)

    实现功能:从数据库加载出所有的数据库名,相应的数据库加载对应的数据库表名 原理:(首先看一下参考手册的内容) 异步加载Tree tree 支持内置的异步加载模式,用户创建一个空的tree,然后定义一个 ...

  4. 【Android】Handler的应用(一):从服务器端加载JSON数据

    最终目的 以JSON的形式,将数据存入服务器端. 在Android中,以Handler加载显示大批量文字. 在此以加载金庸小说<天龙八部(新修版)>为例(2580480 字节). 以tom ...

  5. JQuery和原生JS跨域加载JSON数据或HTML。

    前提:有时候需要在网页上,加载另一个网站上的数据.或者加载另一个网站上的一个页面.Js的Ajax请求不具备跨域功能,可以使用JQuery来实现. 网页端JS代码: $(function () { $. ...

  6. BootStrap的表格加载json数据,并且可以搜索,选择

    2018.4.11日更新,8号的时候我推荐去官网下载,但是那个版本不知道为什么我无法使用 $table.bootstrapTable('getSelections'); 无论如何...然后我尝试着更换 ...

  7. EasyUI datagrid动态加载json数据

    最近做一个项目,要求是两张张表可能查找出10多种不同的结果集. 如果想只用一个表格就把全部的结果不同的显示出来那么就肯定不同使用固定的字段名字,要通过动态加载后台返回来的数据把它显示出来就必须动态加载 ...

  8. vue通过ajax加载json数据

    HTML <ul id="Hanapp"> <li class="styVue" v-for="item in actList&qu ...

  9. MVC4中EasyUI Tree异步加载JSON数据生成树

      1,首先构造tree接受的格式化数据结构MODEL /// <summary> /// 定义EasyUI树的相关数据,方便控制器生成Json数据进行传递 /// </summar ...

随机推荐

  1. 十七 Python分布式爬虫打造搜索引擎Scrapy精讲—深度优先与广度优先原理

      网站树形结构 深度优先 是从左到右深度进行爬取的,以深度为准则从左到右的执行(递归方式实现)Scrapy默认是深度优先的   广度优先 是以层级来执行的,(列队方式实现)

  2. SVN更新操作提示需要清理操作,清理操作提示乱码,更新SVN失败

    1.下载sqlite3.exe,下载方式如下: 1):sqlite网址:https://www.sqlite.org/download.html (根据操作系统自行下载) 2.下载的文件解压后将sql ...

  3. Project facet Java 1.8 is not supported by target runtime Apache Tomcat v7.0.

    找到项目下的“.settings”

  4. syslinux启动盘制作

    # <font color=DarkCyan >syslinux启动盘制作</font> # ### 准备工具 ### 1. BOOTICEx64 软件 ##分区引导制作工具 ...

  5. Linux 忘记密码解决方法,Linux 远程登录

    一.Linux 忘记密码解决方法 很多朋友经常会忘记Linux系统的root密码,linux系统忘记root密码的情况该怎么办呢?重新安装系统吗?当然不用!进入单用户模式更改一下root密码即可. 步 ...

  6. GitHub:Git的使用

    1.下载安装后设置姓名和邮箱地址 $ git config --global user.name "yourGithubName" $ git config --global us ...

  7. RabbitMQ(1) 核心概念

    消息中间价 消息中间价,也称消息队列,是分布式式系统中常用的中间价. 通过消息中间价传递消息,使得各个子系统解耦,异步通信. 目前业界有许多消息队列的实现,如RabbitMQ.Kafka.Active ...

  8. COW写时复制

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  9. PHP trim()函数的作用和使用方法

    PHP trim()函数一般是用来去除字符串首尾处的空白字符(或者其他字符),一般在用在服务端对接收的用户数据进行处理,以免把用户误输入的空格存储到数据库,下次对比数据时候出错. 该函数有两个参数,第 ...

  10. 剑指offer--40.翻转单词顺序列

    时间限制:1秒 空间限制:32768K 热度指数:276854 本题知识点: 字符串 题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写 ...