0
点赞
收藏
分享

微信扫一扫

Hadoop基础-13-Hive实战


源码见:https://github.com/hiszm/hadoop-train

外部表在Hive中的使用

带有​​EXTERNAL​​关键字的就是外部表

不然一般都是内部表(​​managed_table​​)

CREATE EXTERNAL TABLE emp_external(
empno INT,
ename STRING,
job STRING,
mgr INT,
hiredate TIMESTAMP,
sal DECIMAL(7,2),
comm DECIMAL(7,2),
deptno INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
LOCATION '/hive/emp_external';

内部表

外部表

内部表数据由Hive自身管理

外部表数据由HDFS管理;

内部表数据存储的位置是​​hive.metastore.warehouse.dir​

(默认:​​/user/hive/warehouse​​),

外部表数据的存储位置由自己制定(如果没有​​LOCATION​​,

Hive将在​​HDFS​​上的​​/user/hive/warehouse​​文件夹下以外部表的表名创建一个文件夹,

并将属于这个表的数据存放在这里);

删除内部表会直接删除元数据(metadata)及存储(​​HDFS​​)数据;

删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除;

对内部表的修改会将修改直接同步给元数据

而对外部表的表结构和分区进行修改,则需要修复(​​MSCK REPAIR TABLE table_name​​;)

track_info分区表的创建

Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大。

分区为 HDFS 上表目录的子目录​,数据按照分区存储在子目录中。如果查询的 ​​where​​ 字句的中包含分区条件,则直接从该分区去查找,而不是扫描整个表目录,合理的分区设计可以极大提高查询速度和性能。

create external table trackinfo(
ip string,
country string,
province string,
city string,
url string,
time string,
page string
)partitioned by (day string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
location '/project/trackinfo';

Hadoop基础-13-Hive实战_hadoop

将ETL的数据加载到Hive表

crontab表达式进行调度

Azkaban调度: ETLApp==>其它的统计分析

​LOAD DATA INPATH 'hdfs://hadoop000:8020/project/input/etl/part-r-00000' OVERWRITE INTO TABLE trackinfo partition(day='2013-07-21');​

[hadoop@hadoop000 data]$ hadoop fs -ls /project/trackinfo
Found 1 items
drwxr-xr-x - hadoop supergroup 0 2020-09-09 22:45 /project/trackinfo/day=2013-07-21
[hadoop@hadoop000 data]$

使用Hive完成统计分析功能


统计 pv


​select count (*) from trackinfo where day ='2013-07-21';​

Hadoop基础-13-Hive实战_hive_02


城市统计


​select province , count (*) from trackinfo where day ='2013-07-21' group by province;​

Hadoop基础-13-Hive实战_hive_03


省份临时统计表


create external table trackinfo_province(
province string,
cnt bigint
)partitioned by (day string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
location '/project/trackinfo/province';
insert overwrite table trackinfo_province partition(day='2013-07-21')
select province , count (*) as cnt from trackinfo where day ='2013-07-21' group by province;
select * from trackinfo_province where day='2013-07-21';

然后用​​sqoop​​​导入到​​RDMS​​里面


  1. ETL
  2. 将ETL加入到trackinfo里面
  3. 然后讲统计结果按照分区一次导入到各个表中
  4. 再把数据导入关系数据库里面

上述过程可以封装起来然后用​​crontab/Azkaban​​直接运行即可

Hadoop基础-13-Hive实战_数据库_04



举报

相关推荐

0 条评论