• hive加载json数据解决方案


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

    首先创建元数据表:

    create EXTERNAL table access_log (content string) 
    row format delimited fields terminated by ' '
    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 ' '
    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数据和分区表的问题就解释清楚了,不明白下方留言,我们继续讨论。

  • 相关阅读:
    概率论02 概率公理-集合
    概率论1 计数-排列-组合
    matplotlib 练习
    python itertools模块练习
    主观世界的破碎与重建——湖畔大学的失败课外课
    Python操作MongoDB(PyMongo模块的使用)
    python操作json数据格式--基础
    linux shell awk实现实时监控网卡流量脚本
    Python 的十个自然语言处理工具
    实现优先级队列 --heapq模块
  • 原文地址:https://www.cnblogs.com/wq920/p/7236492.html
Copyright © 2020-2023  润新知