DML操作

Load

在将数据加载到表中时,Hive不会进行任何转换。加载操作是将数据文件移动到与Hive表对应的位置的纯复制、移动操作。

语法结构:

load data [local] inpath ‘filepath’ [overwrite] into table tablename [partition(par2=val1,par2=val2......)]

说明

1、filepath

相对路径:如project/data1

绝对路径:如/user/hive/project/data1

完整URI:如hdsf://namenode:9000/user/hive/project/data1

filepath可以引用一个文件(在这种情况下,Hive将文件移动到表中),或者它可以是一个目录(在这种情况下,Hive将把该目录中的所有文件移动到表中)

  1. Local

如果指定了local,load命令将在本地文件系统中查找文件路径

load命令会将filepath中的文件复制到目录文件系统中。目标文件系统由表的位置属性决定。被复制的数据文件移动到表的数据对应的位置

如果没有指定local关键字,如果filepath指向的是一个完整的URI,Hive会直接使用这个URI.否则:如果没有指定schema或者authority,Hive会使用在hadoop配置文件中定义的schema和authority,fs.default.name制定了Namenode的URI

  1. Overwrite

如果使用了overwrite关键字,则目标表(或者分区)中的内容会被删除,然后再将filepath指向的文件或目录中的内容添加到表或者分区中

如果目标表(分区)已经有一个文件,并且文件名和filepath中的文件名冲突,那么现有的文件会被新文件所替代

Insert

Hive中insert主要是结合select查询语句使用,将查询结果插入到表中,例如:

insert overwrite table stu_buck

select * from student cluster by (sno);

需要保证查询结果的数目和需要插入数据表格的列数目一致

如果查询出来的数据类型和插入表格对应的列数据类型不一致,将会进行转换,但还是不能保证装换一定成功,转换失败的数据将会为null

可以将一个查询出来的数据插入到原表中,结果相当于自我复制了一份数据。

Multi inserts多重插入

form source_table

insert overerite table tablename1 [partition (par1=val1,par2=val2.......)]

select_statement1

insert overerite table tablename2 [partition (par1=val1,par2=val2.......)]

select_statement1.....

多重插入

创建三张表,如下

create table source_table (id int,name string) row format delimited fields terminated by ',';

create table test_insert1(id int) row format delimited fields terminated by ',';

create table test_insert2(name string) row format delimited fields terminated by ',';

给source_table创建数据,新建文件source.txt,在文件中编写如下数据

加载数据

命令:load data local inpath '/root/hivedata/source.txt' into table source_table;

执行多重插入

from source_table

insert overwrite table test_insert1

select id

insert overwrite table test_insert2

select name;

Dynamic partition inserts动态分区插入

语法:insert overwrite table tablename partition (par1=val1,par2=val2......) select_statement from from_statement;

动态分区是通过位置来对应分区值的。原始select出来的值和输出partition的值的挂你仅仅是通过位置来确定的,和名字并没有关系

动态分区插入

set hive.exec.dynamic.partition=true; #是否开启动态分区功能,默认是false关闭

set hive.exec.dynamic.partition.mode=nonstrict; #动态分区模式,默认是static,表示必须指定至少一个动态分区为静态分区,nonstrict模式表示允许所有的分区字段都可以使用动态分区

需求

将dynamic_partition_table中的数据按照时间(day),插入到目标表d_p_t的相应分区中

原始表

create table dynamic_partition_table (day string,ip string) row format delimited fields terminated by ',';

数据信息

2020-05-10,ip1

2020-05-10,ip2

2020-05-12,ip3

2020-05-12,ip4

2020-06-13,ip3

2020-06-14,ip1

2020-06-15,ip2

load data local inpath '/root/hivedata/dynamic_partition_table.txt' into table dynamic_partition_table;

目标表

create table d_p_t(ip string) partitioned by (month string,day string);

动态插入

insert overwrite table d_p_t partition (month,day)

select ip,substr (day,1,7) as month,day

from dynamic_partition_table;

导出表数据

语法结构:

insert overwrite [local] directory directory1 select.....form.....

multiple inserts:

from form_statement

insert overwrite [local] directory directory1 select_statement1

[insert overwrite [local] directory directory1 select_statement1].....

数据写入到文件系统时进行文本序列化,且每列用^A来区分,n为换行符

查询结果导出到文件系统

将查询的结果保存到指定的文件目录(可以是本地,也可以是HDFS)

需求:将Hive中source_table中数据导入到node01上的hive目录下

创建hive目录:mkdir hive

insert overwrite local directory '/root/hive'

select * from source_table;

执行完成查看是否有数据导出

需求:将Hive中source_table中数据导入到HDFS上的gw目录下

insert overwrite directory '/gw'

select * from source_table;

执行完成查看是否有数据导出

Select

基本的select操作

语法结构

Select [all | distinct] select_expr,select_expr,.....

Form table_reference

Join table_other on expr

[where where_condition]

[group by col_list[having condition]]

[cluster by col_list

| [distribute by col_list] [sort by | order by col_list]

]

[limit number]

说明:

  1. order by会对输入做全局排序,因此只有一个reducer,会导致当输入规模较大 时,需要较长的计算时间
  2. sort by 不是全局排序,其在数据进入reducer前完成排序。因此,如果用sort by 进行排序,并且设置mapred.reduce.tasks>1,则sort by只保证每个reducer的 输出有序,不保证全局有序
  3. Distrubute by(字段) 根据指定字段将数据分到不同的reducer,分发算法是 hash散列。
  4. Cluster by(字段) 除了具有distribute by的功能,还会度该字段进行排序。

如果distribute和sort的字段是用一个时,此时,cluster by = distribute by + sort by

分桶、排序查询

select * from student cluster by(sno);

如下语句会报错,应为cluster和sort不能共存

select * from student cluster by(sno) sort by (sage asc);

对某列进行分桶的同时,根据另一个进行排序

select * from student distribute by(sno) sort by(sage asc);

总结

cluster(分且排序,必须一样)==distribute(分) + sort(排序)(可以不一样)

Hive join操作

Hive中除了支持和传统数据库中一样的内关联、左关联、右关联、全关联,还支持left semi join 和cross join,但是两种join类型也可以用前面的代替

Hive支持等值连接(a.id=b.id),不支持非等值(a.id>b.id)的连接,因为非等值连接非常男转化到map/reduce任务。另外,Hive支持多2个以上表之间的join

写join查询时,需要注意一下几点:

join时,每次map/reduce任务的逻辑

Reduce会缓存join序列中除了最后一个表的所有表的记录,再通过最后一个表将结果序列化到文件系统。这一实现有助于在reduce端减少内存的使用量。实践中,应该把最大的那个表写在最后(否则或因为缓存浪费大量内存)

left,right和full outer关键字用于处理join中空记录的情况

对应所有a变中的记录都有一条记录输出。输出的结果应该是a.val,b.val,当a.key=b.key时,而当b.key中找不到等值的a.key记录时也会输出:

a.val,null

所以a表中的所有记录都被保留了

a right outer join b 会保留所有b表的记录

准备数据

a表数据

1,a

2,b

3,c

4,d

7,y

8,u

b表数据

2,bb

3,cc

7,yy

9,pp

建表

create table a(id int,name string) row format delimited fields terminated by ',';

create table b(id int,name string) row format delimited fields terminated by ',';

导入数据

load data local inpath '/root/hivedata/a.txt' into table a;

load data local inpath '/root/hivedata/b.txt' into table b;

实验

设置Hive本地模式执行,提高执行效率

set hive.exec.mode.local.auto=true;

内关联:inner join

select * fro a inner join b on a.id = b.id

左关联:left join

select * from a left join b on a.id=b.id;

右关联:right join

select * from a right join b on a.id=b.id;

全关联:full outer join

select * from a full outer join b on a.id=b.id;

Hive中的特别join

select * from a left semi join b on a.id=b.id

hive 修改cluster by算法_疯狂Hive之DML操作(四)相关推荐

  1. hive 修改cluster by算法_双重聚类cluster咋做? 线性, logit, tobit可以双聚类吗?

    凡是搞计量经济的,都关注这个号了 邮箱:econometrics666@sina.cn 所有计量经济圈方法论丛的code程序, 宏微观数据库和各种软件都放在社群里.欢迎到计量经济圈社群交流访问. 上一 ...

  2. hive 修改cluster by算法_spark、hive中窗口函数实现原理复盘

    窗口函数在工作中经常用到,在面试中也会经常被问到,你知道它背后的实现原理吗? 这篇文章从一次业务中遇到的问题出发,深入聊了聊hsql中窗口函数的数据流转原理,在文章最后针对这个问题给出解决方案. 一. ...

  3. hive 修改cluster by算法_Hive入门实战(一)概述与使用

    一.Hive基本概念 1.概念 Hive:由Facebook开源用于解决海量结构化日志的数据统计. Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询 ...

  4. hive 修改cluster by算法_Hive基础之导出数据

    我们在hive中分析完数据后有时候需要将结果导出到本地文件以供其他用途.hive中提供了几种方式来导出结果,下面就详细介绍一些这几种导出数据的方法. 1.导出到本地文件目录 (default 查看一下 ...

  5. hive 修改分桶数 分桶表_疯狂Hive之DDL操作二(三)

    分区表创建 在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition分区概念 分区表指的是在创建表的时 ...

  6. hive向mysql导数据_导入Hive数据导MySQL

    导入Hive数据到MySQL 1. UDF 使用UDF比较方便,代码在http://svn.apache.org/repos/asf/hive/trunk/contrib/src/java/org/a ...

  7. hive 指定字段插入数据_为hive增加列存储

    为hive增加列存储应该算是我在hive上进行的第一个比较大的尝试. 目前已经实现对列表的INSERT操作. 在这一周时间里,我对hive的理解更加的深入. 废话不说,下面开始介绍下hive的列存储功 ...

  8. hive把字符串转换为时间_关于hive的时间转换

    Wendy_Jacky 把时间(201704271211)中的每一部分都取出来,然后再拼成目标字符串(2017-04-27 12:11).代码如下:#include   // for sprintf, ...

  9. Hive基本操作,DDL操作(创建表,修改表,显示命令),DML操作(Load Insert Select),Hive Join,Hive Shell参数(内置运算符、内置函数)等

    1.  Hive基本操作 1.1DDL操作 1.1.1    创建表 建表语法 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_nam ...

最新文章

  1. PyQt5 技巧篇-复选框绑定行内容,全选、清空、展示选中的内容功能实现演示,设置复选框选中,检查复选框选中状态
  2. Expression Blend实例中文教程(4) - 布局控件快速入门Canvas
  3. PHP特级课视频教程_第二十七集 Coreseek安装与测试_李强强
  4. soapUI(groovy脚本作用1)请不要问为什么系列1
  5. 由脚本创建的新元素事件不触发和用的easyUI插件中的多选框不起作用的解决方法...
  6. 银行业金融机构数据治理指引和DCMM的对比分析
  7. dns服务器优化 360,360DNS优化
  8. 海康威视前端实习生面试
  9. 微信Android客户端后台保活经验分享
  10. 微信小程序设置web-view的业务域名
  11. CSFB和SRVCC概念解释
  12. 树莓派4b主板特点_树莓派4B的入手操作
  13. 有三顶红帽子和两顶蓝帽子逻辑推理
  14. Javascript+webdriverio App自动化demo
  15. 记一次授权的APK渗透测试
  16. 从两家主流报表工具的报jia看报表行业的报jia水深-----常用报表工具对比---主流报表对比
  17. while循环语句初学
  18. cannot build player while editor is importing assets or compiling scripts
  19. Python----关键字in , 计算序列的函数
  20. idea接口测试工具

热门文章

  1. 手机(局域网)远程连接 windows电脑
  2. GOOGLE HACKS巧妙使用网络搜索的技巧和工具(第二版)已经出版
  3. datagridvie设置行高列宽_DataGridView控件如何让行高随内容的多少变化啊?
  4. 第8章 中医证型关联规则挖掘
  5. 【C4D】材质+渲染自学宝典(纯干货)
  6. java中的元音 辅音_元音辅音分类表
  7. iOS工程师 - 简历
  8. 《赋能:打造应对不确定性的敏捷团队》
  9. 把视频解码为本地图片的简单方法
  10. AcWing 2041:干草堆(差分)