欢迎访问我的GitHub

https://github.com/zq2599/blog_demos

内容:所有原创文章分类和汇总,及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;

本篇概览

本文是《hive学习笔记》系列的第四篇,要学习的是hive的分区表,简单来说hive的分区就是创建层级目录的一种方式,处于同一分区的记录其实就是数据在同一个子目录下,分区一共有两种:静态和动态,接下来逐一尝试;

静态分区(单字段分区)

先尝试用单个字段分区,t9表有三个字段:名称city、年龄age、城市city,以城市作为分区字段:

  1. 建表:
create table t9 (name string, age int) partitioned by (city string)row format delimited fields terminated by ',';
  1. 查看:
hive> desc t9;OKname                string                                  age                 int                                     city                string                                    # Partition Information  # col_name            data_type           comment               city                string                                  Time taken: 0.159 seconds, Fetched: 8 row(s)
  1. 创建名为009.txt的文本文件,内容如下,可见每行只有name和age两个字段,用来分区的city字段不在这里设置,而是在执行导入命令的时候设置,稍后就会见到:
tom,11jerry,12
  1. 导入数据的命令如下,可见导入命令中制定了city字段,也就是说一次导入的所有数据,city字段值都是同一个:
load data local inpath '/home/hadoop/temp/202010/25/009.txt' into table t9 partition(city='shenzhen');
  1. 再执行一次导入操作,命令如下,city的值从前面的shenzhen改为guangzhou:
load data local inpath '/home/hadoop/temp/202010/25/009.txt' into table t9 partition(city='guangzhou');
  1. 查询数据,可见一共四条数据,city共有两个值:
hive> select * from t9;OKt9.namet9.aget9.citytom11guangzhoujerry12guangzhoutom11shenzhenjerry12shenzhenTime taken: 0.104 seconds, Fetched: 4 row(s)
  1. 前面曾提到分区实际上是不同的子目录,来看一下是不是如此,如下图,红框是t9的文件目录,下面有两个子目录city=guangzhou和city=shenzhen:
  1. 查看子目录里面文件的内容,可见每条记录只有name和age两个字段:
[hadoop@node0 bin]$ ./hadoop fs -ls /user/hive/warehouse/t9/city=guangzhouFound 1 items-rwxr-xr-x   3 hadoop supergroup         16 2020-10-31 16:47 /user/hive/warehouse/t9/city=guangzhou/009.txt[hadoop@node0 bin]$ ./hadoop fs -cat /user/hive/warehouse/t9/city=guangzhou/009.txttom,11jerry,12[hadoop@node0 bin]$

以上就是以单个字段做静态分区的实践,接下来尝试多字段分区;

静态分区(多字段分区)

  • 新建名为t10的表,有两个分区字段:province和city,建表语句:
create table t10 (name string, age int) partitioned by (province string, city string)row format delimited fields terminated by ',';
  • 上述建表语句中,分区字段province写在了city前面,这就意味着第一级子目录是province值,每个province子目录下面再按照city值建立二级子目录,图示如下:
  • 第一次导入,province=‘shanxi’, city=‘xian’:
load data local inpath '/home/hadoop/temp/202010/25/009.txt' into table t10 partition(province='shanxi', city='xian');
  • 第二次导入,province=‘shanxi’, city=‘xian’:
load data local inpath '/home/hadoop/temp/202010/25/009.txt' into table t10 partition(province='shanxi', city='hanzhong');
  • 第三次导入,province=‘guangdong’, city=‘guangzhou’:
load data local inpath '/home/hadoop/temp/202010/25/009.txt' into table t10 partition(province='guangdong', city='guangzhou');
  • 第四次导入,province=‘guangdong’, city=‘shenzhen’:
load data local inpath '/home/hadoop/temp/202010/25/009.txt' into table t10 partition(province='guangdong', city='shenzhen');
  • 全部数据如下:
hive> select * from t10;OKt10.namet10.aget10.provincet10.citytom11guangdongguangzhoujerry12guangdongguangzhoutom11guangdongshenzhenjerry12guangdongshenzhentom11shanxihanzhongjerry12shanxihanzhongtom11shanxixianjerry12shanxixianTime taken: 0.129 seconds, Fetched: 8 row(s)
  • 查看hdfs文件夹,如下图,一级目录是province字段的值:
  • 打开一个一级目录,如下图,可见二级目录是city的值:
  • 查看数据:
[hadoop@node0 bin]$ ./hadoop fs -cat /user/hive/warehouse/t10/province=shanxi/city=hanzhong/009.txttom,11jerry,12
  • 以上就是静态分区的基本操作,可见静态分区有个不便之处:新增数据的时候要针对每一个分区单独使用load命令去操作,这时候使用动态分区来解决这个麻烦;

动态分区

  • 动态分区的特点就是不用指定分区目录,由hive自己选择;
  • 执行以下命令开启动态分区功能:
set hive.exec.dynamic.partition=true
  • 名为hive.exec.dynamic.partition.mode的属性,默认值是strict,意思是不允许分区列全部是动态的,这里改为nostrict以取消此禁制,允许全部分区都是动态分区:
set hive.exec.dynamic.partition.mode=nostrict;
  • 建一个外部表,名为t11,只有四个字段:
create external table t11 (name string, age int, province string, city string) row format delimited fields terminated by ',' location '/data/external_t11';
  • 创建名为011.txt的文件,内容如下:
tom,11,guangdong,guangzhoujerry,12,guangdong,shenzhentony,13,shanxi,xianjohn,14,shanxi,hanzhong
  • 将011.txt中的四条记录载入表t11:
load data local inpath '/home/hadoop/temp/202010/25/011.txt' into table t11;
  • 接下来要,先创建动态分区表t12,再把t11表的数据添加到t12中;
  • t12的建表语句如下,按照province+city分区:
create table t12 (name string, age int) partitioned by (province string, city string)row format delimited fields terminated by ',';
  • 执行以下操作,即可将t11的所有数据写入动态分区表t12,注意,要用overwrite
insert overwrite table t12 partition(province, city) select name, age, province, city from t11;
  • 通过hdfs查看文件夹,可见一级和二级子目录都符合预期:
  • 最后检查二级子目录下的数据文件,可以看到该分区下的记录:
[hadoop@node0 bin]$ ./hadoop fs -cat /user/hive/warehouse/t12/province=guangdong/city=guangzhou/000000_0tom,11

至此,分区表的学习就完成了,希望能给您一些参考;

欢迎关注我的公众号:程序员欣宸

hive load data inpath 空目录_hive学习笔记之四:分区表相关推荐

  1. hive load data inpath 空目录_Hive内部表 | 每日五分钟学大数据

    上一篇说的是外部表,当把EXTERNAL关键字去掉的时候就是内部表了.为什么叫内部表,因为这种表,Hive会(或多或少地)控制着数据的生命周期. 如果你熟悉Hive那你一定知道,Hive默认情况下会将 ...

  2. hive load data inpath 空目录_走近大数据之Hive进阶(一、Hive数据的导入)

    一.使用Load语句进行数据的导入 -语法: LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE]INTO TABLE tablename [PARTITIO ...

  3. hive load data inpath ‘‘ overwrite into 坑

    load data inpath 'dataDir/dim_url.csv' overwrite into table dim_url partition(day='2021-03') 注意: 1,以 ...

  4. hive 字符串替换指定字符_hive学习笔记:substr()——字符串截取

    在hive中,可以使用substr()函数截取字符串,比如从日期中截取年份.月份等信息. 还有一个函数是substring(),用法基本上与substr()相同,至于区别这里暂时不做研究. subst ...

  5. hive load data外部表报错_从0开始学大数据-Hive基础篇

    Hive起源于Facebook,是基于 Hadoop HDFS 分布式文件系统的分布式 数据仓库 架构.它为数据仓库的管理提供了许多功能:数据ETL(抽取.转换和加载)工具.数据存储管理和大型数据集的 ...

  6. hive load data出错

    今天往hive导数据时发生了个错误 hive> load data inpath '/user/tmp/uids.test_copy_3.txt' into table userfeature. ...

  7. load data inpath的实践

    有个需求,需要在hive表里面追加数据,数据是历史数据,是业务方给的一个csv文件, 思路,考虑使用load data inpath,把历史数据导入到hive表里面 步骤: 1.利用已经搭建好的大数据 ...

  8. Hive - Load Data 数据过长或过短

    一.引言 Hive 可以通过 load data inpath 加载本地或者 hdfs 的数据到 hive 表中,有时会出现生成数据长于 hive 表字段或者短于 hive 表字段的情况,经过测试,两 ...

  9. oracle拆分分区语法详解大全_学习笔记:Oracle分区表 添加 删除 合并 删除 交换 拆分等分区表的操作案例...

    天萃荷净 Oracle分区表管理,记录关于Oracle分区表的管理案例:创建.删除.合并.拆分.交换.更改分区表的操作方法 1.添加创建分区表 1.1)增加分区(add partition) 语法是: ...

最新文章

  1. idea 自动生成构造以及get、set方法
  2. python turtle循环图案-Python绘图Turtle库详解
  3. 题目1507:不用加减乘除做加法
  4. 平安城市与智慧城市对接的关键要素
  5. [C++11]initializer_lisr模板类的使用
  6. Markdown--编辑表格与矩阵
  7. animition动画的加入
  8. 产生随机数(rand()函数和srand()函数)的含义
  9. linux 小巧的浏览器,崇尚简约 六款小体积浏览器推荐
  10. android rom root权限,教你刷机包获取ROOT权限的方法
  11. COMFORT 美食 | 四季银河,心飨臻味
  12. 经济学人The Economist学习(笔记词汇)Day1
  13. 监听滚动事件 实现动态锚点
  14. JEPF软件快速开发平台学习心得之请假单功能的完成(一)
  15. 分区表与普通表之间切换的报错
  16. java金花_炸金花绝对大小计算、比较及排序算法(Java),包含花色参与和不参与大小比较...
  17. 20_外星人游戏项目03——
  18. 杭电2019计算机分数线,杭州电子科技大学2019年各省录取分数线及各专业录取分数线...
  19. 三种架构模式——MVC、MVP、MVVM
  20. 中国时隔两年再次全面降息 专家称或刺激楼市回暖

热门文章

  1. 阿里立秋:AI千人千面,淘宝如何做智能化UI测试?
  2. Spring Cloud 入门 之 Eureka 篇(一)
  3. matplotlib 简单试用
  4. 再谈迭代器,生成器,yield,及和类的使用
  5. GC参考手册 —— GC 调优(基础篇)
  6. 探讨 .NET 4 新增的 SortedSet 类
  7. SparkMLlib回归算法之决策树
  8. ASP.NET Core应用的错误处理[2]:DeveloperExceptionPageMiddleware中间件如何呈现“开发者异常页面”...
  9. 制作MACOSX10.10.3/10.9安装启动盘U盘的教程
  10. 用递归将嵌套的JSON对象遍历出来,转为二维数组