hive 关联表和外表的区别:

1. 外部表需要external关键之,location是数据文件默认存放位置,不管是不管是select 还是load的数据都存放在这里。导入数据到外部表,数据并没有mv到数据仓库目录,而是在loacation目录。2.内部表建表时也能加上location,作用和外部表一样,都是表数据的存放路径,不同的是drop table时内部表会将hdfs上的数据也删掉,外部表仅仅是删除表的元数据,原始数据不会删除。Hive 外表的优点:1.安全,外部表不用担心表删除带来的风险。在Hive当中,对于外部表来说,我们在删除表数据的时候,删除的仅仅是表的元数据信息,但是却不能删除掉表中的真实数据。
2.灵活,方便数据共享,使用更加灵活。

外部数据

hive> dfs -ls /dw/im/prod/sessionContent;
Found 7 items
drwxr-xr-x   - icosc  hadoop          0 2018-11-07 23:55 /dw/im/prod/sessionContent/2018-11-07
drwxr-x--x   - hadoop hadoop          0 2018-11-08 23:55 /dw/im/prod/sessionContent/2018-11-08
drwxr-x--x   - hadoop hadoop          0 2018-11-09 23:55 /dw/im/prod/sessionContent/2018-11-09
drwxr-x--x   - hadoop hadoop          0 2018-11-10 23:55 /dw/im/prod/sessionContent/2018-11-10
drwxr-x--x   - hadoop hadoop          0 2018-11-11 23:55 /dw/im/prod/sessionContent/2018-11-11
drwxr-x--x   - hadoop hadoop          0 2018-11-12 23:55 /dw/im/prod/sessionContent/2018-11-12
drwxr-x--x   - hadoop hadoop          0 2018-11-13 13:55 /dw/im/prod/sessionContent/2018-11-13
hive>

创建Hive外表

根据数据的存放位置,我在建表 sql 中指定 location

use temp;
create external table tmp_im_session_content(`eventType` string comment "会话类型",`channelId` int comment "渠道 id",`sourceType` int comment "",`sessionId` string COMMENT "会话session id",`cId` string COMMENT "会话 id",`userId` string COMMENT "用户id",`vccId` string COMMENT "企业 id",`total` int COMMENT "",`index` int COMMENT '标识本次是第几次发送会话内容,从1开始 (每次最多发送10条聊天内容)',`content` array<struct<`from`:int,`to`:int,content:string,msgtype:int,`sequence`:bigint,createtime:bigint,errorcode:int,errorstring:string,status:int>> COMMENT '会话内容')PARTITIONED BY (`date` string)location "/dw/im/prod/sessionContent"TBLPROPERTIES ("comment"="IM 会话内容 by gz");

数据装载和验证

我们在建表的时候,已经指定了location,但是我们去查的时候,发现并没有数据。

hive> select> a.*> from temp.tmp_im_session_content a> where `date` = '2018-11-07'> limit 40;
OK
Time taken: 0.107 seconds
hive>

为什么???????????????????

这是因为虽然在HDFS当中数据已经存在了,但是在Hive的元数据仓库中并没有,所以我们查不到数据。

给Hive 外表数据仓库装载数据

-- 创建分区并指定 location
alter table temp.tmp_im_session_content add if not exists partition (`date`='2018-11-07') location '/dw/im/prod/sessionContent/2018-11-07';-- 验证数据
select
eventType,
channelId,
sourceType,
sessionId,
cId,
userId,
vccId,
total,
index,
content
from temp.tmp_im_session_content a
where `date` = '2018-11-07'
limit 40;select
a.*
from temp.tmp_im_session_content a
where `date` = '2018-11-07'
limit 40;
-- 验证 ok

修复分区

Hive提供了一个"Recover Partition"的功能。原理相当简单,执行后,Hive会检测如果HDFS目录下存在,但表的metastore中不存在的partition元信息,更新到metastore中。如下:

msck repair table temp.tmp_im_session_content;

问题又来了,查询:

hive> select> a.*> from temp.tmp_im_session_content a> where `date` = '2018-11-08'> limit 40;
OK
Time taken: 0.107 seconds
hive>

还是没数据。这里就不得不说源数据存放的格式了。我创建的外表分区字段是 date,但是我们的源文件路径是/dw/im/prod/sessionContent/2018-11-08,按照分区目录的格式应该是/dw/im/prod/sessionContent/date=2018-11-08。因此,用修复命令没起作用。这就要求在写 HDFS 的时候做好格式约定,避免后续各种意想不到的惊喜 ☹。

这个问题,可以通过下面 laod data inpath 一节了解更详细的内容

laod data inpath 装载数据

命令如下:

laod data inpath '/dw/im/prod/sessionContent/2018-11-08' overwrite into table temp.tmp_im_session_content PARTITION (`date`='2018-11-08');

看下源文件状态:

hive> dfs -ls /dw/im/prod/sessionContent/> ;
Found 7 items
drwxr-xr-x   - icosc  hadoop          0 2018-11-07 23:55 /dw/im/prod/sessionContent/2018-11-07
drwxr-x--x   - hadoop hadoop          0 2018-11-09 23:55 /dw/im/prod/sessionContent/2018-11-09
drwxr-x--x   - hadoop hadoop          0 2018-11-10 23:55 /dw/im/prod/sessionContent/2018-11-10
drwxr-x--x   - hadoop hadoop          0 2018-11-11 23:55 /dw/im/prod/sessionContent/2018-11-11
drwxr-x--x   - hadoop hadoop          0 2018-11-12 23:55 /dw/im/prod/sessionContent/2018-11-12
drwxr-x--x   - hadoop hadoop          0 2018-11-13 14:35 /dw/im/prod/sessionContent/2018-11-13
drwxr-x--x   - hadoop hadoop          0 2018-11-08 23:55 /dw/im/prod/sessionContent/date=2018-11-08

发现什么没?原来的目录/dw/im/prod/sessionContent/2018-11-09的目录不见了,但是多了一个/dw/im/prod/sessionContent/date=2018-11-08的目录。

前面我们提到,如果分区很多的时候,可以通过msck repair table tableName 的方式来修复,但是如果格式不是 Hive 标准的分区文件存储格式,这个命令就没什么卵用。从刚刚的laod data命令我们也可以看出,此命令会移动数据文件,如果不是标准的问价存储路径,也会根据命令进行相应的调整。这一点很重要,需要记住。

如果需要传递日期变量,可以:

-- 针对标准的分区文件,即显示的按照分区字段存放的数据文件
laod data inpath '/dw/im/prod/sessionContent/date=${date}' overwrite into table temp.tmp_im_session_content PARTITION (`date`='${date}');OR-- 针对非标准的,未显示按照分区字段存放的数据文件
laod data inpath '/dw/im/prod/sessionContent/${date}' overwrite into table temp.tmp_im_session_content PARTITION (`date`='${date}');

这里有个小插曲,前面我通过alter table装载了2018-11-07的数据,目录没有变化,因此有用load data的方式处理:

laod data inpath '/dw/im/prod/sessionContent/2018-11-07' overwrite into table temp.tmp_im_session_content PARTITION (`date`='2018-11-07');

因为使用了overwrite INTO,导致/dw/im/prod/sessionContent/date=2018-11-07的数据被删除了☹️

只好手动将数据又移动回来:

hadoop fs -mv /user/dev/.Trash/181113150000/dw/im/prod/sessionContent/2018-11-07 /dw/im/prod/sessionContent/date=2018-11-07

然后

laod data inpath '/dw/im/prod/sessionContent/date=2018-11-07' into table temp.tmp_im_session_content PARTITION (`date`='2018-11-07');

分区管理

从最前面 HDFS 文件可以看到,还有还6个日期目录,我可以创建5个 alterr table 的语句来装载数据,但是如果有365天的数据需要加载呢?如果写多条365条alter 语句,岂不是很傻?

shell 循环创建

这种方式已经写过,不再赘述,故而此处省略。

load data 方式加载数据

只要load data,数据都会被移动到表的location下面。

删除外表分区管理

-- 删除分区
alter table temp.tmp_im_session_content drop partition(`date`=2018-11-07)

总结

由于我们的源数据目录没有显示的指定分区字段,因此建表的时候没有指定 location,通过 laod data inpath 命令来装载数据

  1. load data 命令会移动数据
  2. laod data inpath ... overwrite 命令使用不当会导致数据被删除,如果看到本文档,可以按照我前面的方式进行处理即可。
  3. 通过 alter table 的方式装载数据,会将源文件与 对应的 Hive 表仓库进行映射,但是不会移动数据,不会改变目录。

转载于:https://www.cnblogs.com/myblog1900/p/10031816.html

2018-11-13#Hive外表创建和加载数据相关推荐

  1. Android O: View的绘制流程(一): 创建和加载

    从这篇博客开始,我们会用几篇文章,  基于Android O的代码,分析一下View的绘制流程. 在分析具体的绘制流程前,我们先来了解一下XML中定义的View,  如何被创建和加载. 一.setCo ...

  2. DCMTK:用于创建和加载增强型CT对象的测试

    DCMTK:用于创建和加载增强型CT对象的测试 用于创建和加载增强型CT对象的测试 用于创建和加载增强型CT对象的测试 #include "dcmtk/config/osconfig.h&q ...

  3. oracle中spool卸数,Oracle中如何快速的卸载和加载数据?

    前几天有个朋友在MSN上问,如何能更快速的从数据库中卸载和加载数据,他原来是用sql查询spool出来,效率很低. 这让我想起DCBA的一个工具ociuldr,这个工具是用C写成的,通过OCI和数据库 ...

  4. Databricks文档04----使用 Azure Databricks 提取、转换和加载数据

    使用 Azure Databricks 执行 ETL(提取.转换和加载数据)操作. 将数据从 Azure Data Lake Storage Gen2 提取到 Azure Databricks 中,在 ...

  5. [2018/11/13]图像处理

    今晚图像处理课. 我已经把Matlab当作PhotoShop来学了, 看看能把我的照片处理成什么样子. 上节课学了8.6节图像分割 今天学习8.6节二值图像处理 图像的边沿不太光滑的时候可以使用该方法 ...

  6. 2018/11/13 学习心得随手记

    文章目录 windows环境下nginx 本地反向代理和相关http常规配置 Nginx 简介 常用功能 下载安装nginx 命令行启动.关闭.重启nginx 简单的本地反向代理 http常规配置 w ...

  7. QGIS下载和加载数据

    目录 步骤1: 步骤2,注册一个账号,下载它的`空间数据`. 加载下载的数据 步骤1: 获取公开数据,可以从政务数据资源(www.bjdata.gov.cn)获取公开数据,如下图所示 步骤2,注册一个 ...

  8. 实训13 使用SQLyog创建数据库和数据表,生成E-R图——MySQL数据库

    EX13.1 新建一个数据库erp,并使用SQL代码创建两个表,一个商品类别表TYPE_T和一个商品表GOODS_T,表结构如下所示.生成对应的E-R图. 商品类别TYPE_T 字段名 类型 约束 说 ...

  9. Android 7.0 Launcher3的启动和加载流程分析----转载

     Android 7.0 Launcher3的启动和加载流程分析,Launcher的本质就是一个普通应用,它比普通应用多配置了Category的Android:name="android ...

最新文章

  1. SharePoint2010 -- 管理配置文件同步
  2. cheked复选框返回值的时候选中
  3. onmouseover和onmouseout在GridView中应用
  4. centos7 3行命令安装powershell
  5. python(matplotlib1)——figure图像,坐标设置
  6. welcome to my blog
  7. 2015年4月7号的日志
  8. linux CentOS7最小化安装环境静默安装Oracle11GR2数据库(修改配置文件)
  9. 《Go语言实战》Go 类型:基本类型、引用类型、结构类型、自定义类型
  10. 汉语为主体的计算机网络环境,读书笔记 | 鲁川:汉语语法的意合网络 | 从网络到表层序列的生成...
  11. FAT,FAT32,NTFS
  12. 优化 WindowsXPSP2 系统服务项设置
  13. between and 用法
  14. 木瓜移动上线全新服务架构 ,SaaS工具成最大亮点
  15. Nodejs搭建前后端分离开发模式下的微信网页项目
  16. 安卓4.4刷linux系统下载,在Linux上安装Android 4.4 KitKat
  17. 物流公司的发出时间在哪里查询,快递单号查询方法
  18. Java核心技术卷一 -第四章:方法参数
  19. 小程序发送通知-可重复多次发送
  20. 分布式FFMPEG转码集群

热门文章

  1. 高性能JavaScript(您值得一看)
  2. Swift基础语法: 23 - Swift的Trailing闭包, 捕获, 闭包是引用类型
  3. c# winform WebBrower 控件中右键获取控件坐标
  4. (进阶)LeetCode(766)——托普利茨矩阵(JavaScript)
  5. Vue中引入swiper插件报错:To install it, you can run: npm install --save swiper/css/swiper.css
  6. python画箭头表示风速风向_python画风羽及风羽定义
  7. idea gui插件_「Java」 - 自写IntelliJ IDEA插件
  8. WebDAV 是什么
  9. 三十岁左右的你正处于什么状态?
  10. 在职场中,什么是职场大忌?