Hive[5] HiveQL 数据操作

5.1 向管理表中装载数据 

Hive 没有行级别的数据插入更新和删除操作,那么往表中装载数据的唯一途径就是使用一种“大量”的数据装载操作,或者通过其他方式仅仅将文件写入到正确的目录下;

LOAD DATA LOCAL INPATH ‘${env:HOME}/califonia-employees‘

OVERWRITE INOT TABLE employees

PARTITON (country=‘‘US, state=‘CA‘) ;

向管理表中装载数据,如果目录不存在的话, overwrite 会先创建分区目录,然后再将数据拷贝到该目录 ;如果是非分区表则应该省略 partition 后面的语句;

通常情况下指定的路径应该是一个目录,而不是一个单个独立的文件,Hive 会将所有的文件都拷贝到这个目录中;

INPATH 子句中使用的文件路径还有一个限制,就是这个路径下可能 包含任何文件夹;

注意:如果使用了 LOCAL 关键字,这个路径应该为本地文件系统路径,数据将会被拷贝骊目标位置,如果省略掉 LOCAL关键字,那这个路径应该是分布式文件系统中的路径,这咱情况数据是从这个路径转移到目标位置;

LOAD DATA LOCAL 。。。 拷贝本地数据到位于分布式文件系统上的目标位置;

LOAD DATA 。。。转移数据到目标位置;

注意:Hive 要求源文件和目标文件以及目录应该在同个文件系统中,用户不可以使用 LOCAL DATA 语句将数据从一个集群的 HDFS 中转移 到另一个集群的 HDFS 中;

指定全路径会具有更好的鲁棒性,但也同样支持相驿路径,当使用本地模式执行时,相对路径相对的是当 Hive CLI 启动时用户的工作目录,对于分布式或者伪分布式模式,这个路径解读为相对于分布式文件系统中用户的根目录,该目录在 HDFS 和 MapRFS中默认为 /user/$USER;

如果用户指定了 OVERWRITE 关键字,那么目标文件夹中之前存在的数据将会被先删除掉,如果没有,仅仅会把新增的文件增加到目标文件夹中而不会删除之前的数据。如果目标文件夹中的文件已经存在和装载的文件同名的文件,那么旧的同名文件将会被覆盖重写;

如果目录是分区表,那么需要使用 PARTITON 子句,而且用户还必须为每个分区的键指定一个值 ;

Hive 并不会验证用户装载的数据和表的模式是否匹配,但会验证文件格式是否和表结构定义的一致;(如存储格式为 SEQUENCEFILE V,那么装载进去的格式也必须为这种)

5.2 通过查询语句向表中插入数据

insert overwrite table employees partition(country=‘us‘,state=‘or‘)

select * from staged_employees se where se.cnty=‘us‘ and se.st=‘or‘

OVERWRITE 关键字会将以前分区之中的内容覆盖掉,如果改成 INOT 则会以追加的方式写入数据;(0.8.0以后的版本才有)

FROM staged_employees se

INSERT OVERWRITE TABLE employees

PATRITION(country=‘us‘,state=‘or‘)

SELECT * WHERE se.cnty=‘us‘ AND se.st=‘or‘

INSERT OVERWRITE TABLE employees

PATRITION(country=‘us‘,state=‘ca‘)

SELECT * WHERE se.cnty=‘us‘ AND se.st=‘ca‘

INSERT OVERWRITE TABLE employees

PATRITION(country=‘us‘,state=‘il‘)

SELECT * WHERE se.cnty=‘us‘ AND se.st=‘il‘

以上语句可以只扫描一次表 staged_employees 就可以做多次插入其他表

动态分区插入

INSERT OVERWRITE TABLE employees

PARTITION(country,state)

SELECT ...,se.cnty,  se.st

FROM staged_employees se;

Hive 会根据 SELECT 语句中最后2列来确定分区字段 counrty 和 state 的值

INSERT OVERWRITE TABLE employees PARTITION (country=‘us‘,state)

SELECT ..., se.cnty,se.st FROM staged_employees se WHERE se.cnty=‘us‘

静态+动态分区联合使用

【注意:静态分区必须出现在动态分区之前,而且动态分区默认情况下是没有开启的,开启后默认是以“严格”模式执行的,在这种模式下要求至少有一列分区字段是静态的,这有助于阻止因设计错误导致查询产生大量的分区】

动态分区属性 【可以用 set 属性=值  来进行设置】 属性    默认值     说明

hive.exec.dynamic.partition    false     设置成 true 表示开启动态分区功能

hive.exec.dynamic.partition.mode    strict    设置成 nonstrict 表示允许所有分区都是动态的

hive.exec.max.dynamic.partitions.pernode    100    每个 mapper 或 reducer 可以创建的最大动态分区个数

hive.exec.max.dynamic.partitions    +1000    一个动态分区创建语句可以创建的最大动态分区个数,如果超过出报错

hive.exec.max.created.files     100000    全局可以最大文件个数,如果超过会报错

5.3 单个查询语句中创建表并加载数据 【本功能不能使用于外部表】

CREATE TABLE ca_employees AS SELECT name,salary,address FROM employees WHERE se.state=‘ca‘ ;

5.4 导出数据

hadoop fs -cp source_path target_path 直接用 hadopp 命令导出语句

INSERT OVERWRITE LOCAL DIRECTORY ‘/tmp/ca_employees‘    --最后面的路径也可以写成 URL 路径(hdfs://master-server/tmp/ca_employees)

SELECT name, salary, address FROM employees WHERE se.state =‘ca‘;  一个或多个文件将会被保存到 /tmp/ca_employees 目录下,不管Hive 表中数据实际是怎么存储的,Hive 会将所有的字段序列化成字符串写入到文件中,Hive 会使用和 Hive 内部存储的表相同的编码方式来生成输出文件。

hive> ! ls /tmp/ca_employees;  在hive里执行bash命令查看文件

用户也可以和向表中插入数据一样,通过以下方式指定多个输出文件夹目录:

FROM staged_employees se

INSERT OVERWRITE directory ‘/tmp/or_employees‘

PATRITION(country=‘us‘,state=‘or‘)

SELECT * WHERE se.cnty=‘us‘ AND se.st=‘or‘

INSERT OVERWRITE directory ‘/tmp/ca_employees‘

PATRITION(country=‘us‘,state=‘ca‘)

SELECT * WHERE se.cnty=‘us‘ AND se.st=‘ca‘

INSERT OVERWRITE directory ‘/tmp/il_employees‘

PATRITION(country=‘us‘,state=‘il‘)

SELECT * WHERE se.cnty=‘us‘ AND se.st=‘il‘

时间: 2024-10-10 03:44:34

Hive[5] HiveQL 数据操作的相关文章

hive学习笔记-数据操作

hive数据操作 hive命令行操作 hive -d --define <key=value> 定义一个key-value可以在命令行中使用 hive -d database <databasename>    指定使用的数据库 hive -e "hql"    不需要进入cli执行hql语句,可以在脚本中使用 hive -f fileName 将hql放到一个file文件中执行,sql语句来自file文件 hive -h hostname 访问主机,通过主机的

Hive最新数据操作详解(超级详细)

 数据操作能力是大数据分析至关重要的能力.数据操作主要包括:更改(exchange),移动(moving),排序(sorting),转换(transforming).Hive提供了诸多查询语句,关键字,操作和方法来进行数据操作. 一. 数据更改 数据更改主要包括:LOAD, INSERT, IMPORT, and EXPORT 1. LOAD DATA load关键字的作用是将数据移动到hive中.如果是从HDFS加载数据,则加载成功后会删除源数据:如果是从本地加载,则加载成功后不会删除源数

使用Hive或Impala执行SQL语句,对存储在HBase中的数据操作

使用Hive或Impala执行SQL语句,对存储在HBase中的数据操作 Hive Impala HBase HiveQL 大数据 使用Hive或Impala执行SQL语句,对存储在HBase中的数据操作 〇.摘要 一.基础环境 二.数据存储在HBase中,使用Hive执行SQL语句 Ⅰ.创建Hive外部表 Ⅱ.从HBase读 Ⅲ.向HBase写 三.数据存储在HBase中,使用Impala执行SQL语句 Ⅰ.从HBase读 Ⅱ.向HBase写 四.综上所述 〇.摘要 Hive是基于Hadoop

hive(3)HiveQL数据定义

HiveQL与传统SQL区别 HiveQL是Hive的查询语言.与mysql的语言最接近,但还是存在于差异性,表现在:Hive不支持行级插入操作.更新操作和删除操作,不支持事物. 基本语法 数据库操作 1.创建数据库hive> create database test; 或者 create database if not exists test;2.查看数据库对应的目录文件创建的数据库对应的数据目录或者存储在hdfs的目录为在hive配置文件里面定义的hive.metastore.warehou

hive数据操作

mdl是数据操作类的语言,包括向数据表加载文件,写查询结果等操作 hive有四种导入数据的方式 >从本地加载数据 LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE [tableName]; >从hdfs上加载数据 load data inpath 'hdfs://192.168.177.124:9000/opt/hive/warehouse/student.txt' >从其他表中查出数据并加载到其

hive 表的常用操作

使用load 方式加载数据到Hive 表中,注意分区表加载数据的特殊性 如何保存HiveQL 查询结果:保存到表中,保存到本地文件(注意指定列分隔符) 常见查询练习,如group by.having.join.sort by.order by 等. 一:hive 表的操作 1.1.1 hive的库的创建与数据库的查看: hive(default)> create database yangyang; hive(default)> use yangyang; hive(yangyang)>

Hive几种数据导出方式

Hive几种数据导出方式 今天我们再谈谈Hive中的几种不同的数据导出方式.可以根据导出的地方不一样,将这些方式分为三种: (1).导出到本地文件系统: (2).导出到HDFS中: (3).导出到Hive的另一个表中.为了避免单纯的文字,我将一步一步地用命令进行说明. 一.导出到本地文件系统 hive> insert overwrite local directory '/home/wyp/wyp' > select * from wyp; 这条HQL的执行需要启用Mapreduce完成,运行

HIVE几种数据导入方式

HIVE几种数据导入方式 今天的话题是总结Hive的几种常见的数据导入方式,我总结为四种:(1).从本地文件系统中导入数据到Hive表:(2).从HDFS上导入数据到Hive表:(3).从别的表中查询出相应的数据并导入到Hive表中:(4).在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中.我会对每一种数据的导入进行实际的操作,因为纯粹的文字让人看起来很枯燥,而且学起来也很抽象.好了,开始操作! 一.从本地文件系统中导入数据到Hive表 先在Hive里面创建好表,如下: hive

数道云大数据平台解决方案,Hadoop + HDFS+Hive+Hbase大数据开发整体架构设计

波若大数据平台(BR-odp)Hadoop + HDFS+Hive+Hbase大数据开发工具剖析: HDFS:分布式.高度容错性文件系统,能提供高吞吐量的数据访问,非常适合大规模数据集上的应用,大规模的波若大数据平台(BR-odp)用户部署上1000台的HDFS集群.数据规模高达50PB以上 HDFS和MR共同组成Hadoop分布式系统体系结构的核心.HDFS在集群上实现了分布式文件系统,MR在集群上实现了分布式计算和任务处理.HDFS在MR任务处理过程中提供了文件操作和存储等支持,MR在HDF