2. HIVE 基本操作(hive的使用方法)
wxin55 2024-11-06 12:44 10 浏览 0 评论
2.1 create table
2.1.1 总述
l CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXIST 选项来忽略这个异常。
l EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建
外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部
表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
l LIKE 允许用户复制现有的表结构,但是不复制数据。 l 用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。如果没有指定 ROW
FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。在建表的时候,用户还
需要为表指定列,用户在指定表的列的同时也会指定自定义的 SerDe,Hive 通过 SerDe
确定表的具体的列的数据。
l 如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCE 。
l 有分区的表可以在创建的时候使用 PARTITIONED BY 语句。一个表可以拥有一个或者多个分区,每一个分区单独存在一个目录下。而且,表和分区都可以对某个列进行
CLUSTERED BY 操作,将若干个列放入一个桶(bucket)中。也可以利用 SORT BY 对数据进行排序。这样可以为特定应用提高性能。
l 表名和列名不区分大小写,SerDe 和属性名区分大小写。表和列的注释是字符串。
目前在 hive 中常用的数据类型有:
BIGINT – 主要用于状态,类别,数量的字段, 如
status/option/type/quantity
DOUBLE – 主要用于金额的字段, 如 fee/price/bid
STRING – 除上述之外的字段基本都使用 String, 尤其是 id 和日期时间这
样的字段
2.1.3 基本例子
1、如果一个表已经存在,可以使用 if not exists
2、 create table xiaojun(id int,cont string) row format delimited fields terminated
by '\005' stored as textfile;
terminated by:关于来源的文本数据的字段间隔符
如果要将自定义间隔符的文件读入一个表,需要通过创建表的语句来指明输入文件间隔符,
然后 load data 到这个表。
4、Alibaba 数据库常用间隔符的读取
我们的常用间隔符一般是 Ascii 码 5,Ascii 码 7 等。在 hive 中 Ascii 码 5 用'\005'表示,
Ascii 码 7 用'\007'表示,依此类推。
5、装载数据
查看一下:Hadoop fs -ls
LOAD DATA INPATH '/user/admin/xiaojun/a.txt' OVERWRITE INTO TABLE xiaojun;
6、如果使用 external 建表和普通建表区别
A、指定一个位置,而不使用默认的位置。如:
create EXTERNAL table xiaojun(id int,cont string) row format delimited fields
terminated by '\005' stored as textfile location '/user/admin/xiaojun/';
B、对于使用 create table external 建表完成后,再 drop 掉表,表中的数据还在文件系统
中。如:
hive> create EXTERNAL table xiaojun(id int,cont string) row format delimited
fields terminated by '\005' stored as textfile;
hive> LOAD DATA INPATH '/user/admin/xiaojun' OVERWRITE INTO TABLE xiaojun;
hive> drop table xiaojun;
[admin@hadoop1 bin]$ ./hadoop fs -ls
hdfs://hadoop1:7000/user/hive/warehouse/xiaojun
Found 1 items
使用普通的建表 DROP 后则找不到
2.1.4 创建分区
HIVE 的分区通过在创建表时启用 partition by 实现,用来 partition 的维度并不是实
际数据的某一列,具体分区的标志是由插入内容时给定的。当要查询某一分区的内容时可以
采用 where 语句,形似 where tablename.partition_key > a 来实现。
创建含分区的表。
命令原型:
CREATE TABLE page_view(viewTime INT, userid BIGINT,
page_url STRING, referrer_url STRING,
ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
外部表和内部表内部表由hive管理,外部表是hdfs管理,内部表存储在hive/warehouse下,外部表存储是在创建时用户设置的,drop时,两个表的元数据都会被删除,外部表的表数据不被删除,目录文件还在。
6、如果使用external建表和普通建表区别A、指定一个位置,而不使用默认的位置。如:create EXTERNAL table xiaojun(id int,cont string) row format delimited fields terminated by '\005' stored as textfile location '/user/admin/xiaojun/';B、对于使用create table external建表完成后,再drop掉表,表中的数据还在文件系统中。如:hive>create EXTERNAL table xiaojun(id int,cont string) row formatdelimited fields terminated by '\005' stored as textfile; hive> LOADDATA INPATH '/user/admin/xiaojun' OVERWRITE INTO TABLE xiaojun; hive> drop table xiaojun; [admin@hadoop1bin]$ ./hadoop fs -ls hdfs://hadoop1:7000/user/hive/warehouse/xiaojunFound 1 items使用普通的建表DROP后则找不到版权声明:
COLLECTION ITEMS TERMINATED BY '\002'
MAP KEYS TERMINATED BY '\003'
STORED AS SEQUENCEFILE;
查看表名,部分匹配
SHOW TABLES 'page.*';
SHOW TABLES '.*view';
查看某表的所有 Partition,如果没有就报错:
SHOW PARTITIONS page_view;
查看某表结构:
DESCRIBE invites;
看分区内容
SELECT a.foo FROM invites a WHERE a.ds='2008-08-15';
查看有限行内容,同 Greenplum,用 limit 关键词
SELECT a.foo FROM invites a limit 3;
查看表分区定义
DESCRIBE EXTENDED page_view PARTITION (ds='2008-08-08');
2.5 Load
HIVE 装载数据没有做任何转换加载到表中的数据只是进入相应的配置单元表的位置移
动数据文件。纯加载操作复制/移动操作。
3.1 语法
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename
[PARTITION (partcol1=val1, partcol2=val2 ...)]
Load 操作只是单纯的复制/移动操作,将数据文件移动到 Hive 表对应的位置。
? filepath 可以是: o 相对路径,例如:project/data1
hdfs://namenode:9000/user/hive/project/data1
? 加载的目标可以是一个表或者分区。如果表包含分区,必须指定每一个分区的分区名。
? filepath 可以引用一个文件(这种情况下,Hive 会将文件移动到表所对应的目录中)或者是一个目录(在这种情况下,Hive 会将目录中的所有
文件移动至表所对应的目录中)。
? 如果指定了 LOCAL,那么: o load 命令会去查找本地文件系统中的 filepath。如果发现是相对
路径,则路径会被解释为相对于当前用户的当前路径。用户也可以
为本地文件指定一个完整的 URI,比如:
file:///user/hive/project/data1.
o load 命令会将 filepath 中的文件复制到目标文件系统中。目标文件系统由表的位置属性决定。被复制的数据文件移动到表的数据
对应的位置。
? 如果没有指定 LOCAL 关键字,如果 filepath 指向的是一个完整的 URI,hive 会直接使用这个 URI。 否则:
o 如果没有指定 schema 或者 authority,Hive 会使用在 hadoop 配置文件中定义的 schema 和 authority,fs.default.name 指定
了 Namenode 的 URI。
o 如果路径不是绝对的,Hive 相对于 /user/ 进行解释。 o Hive 会将 filepath 中指定的文件内容移动到 table (或者
partition)所指定的路径中。
? 如果使用了 OVERWRITE 关键字,则目标表(或者分区)中的内容(如果有)会被删除,然后再将 filepath 指向的文件/目录中的内容添加到表/
分区中。
? 如果目标表(分区)已经有一个文件,并且文件名和 filepath 中的文件名冲突,那么现有的文件会被新文件所替代。
从本地导入数据到表格并追加原表
LOAD DATA LOCAL INPATH `/tmp/pv_2008-06-08_us.txt` INTO TABLE c02
PARTITION(date='2008-06-08', country='US')
从本地导入数据到表格并追加记录
LOAD DATA LOCAL INPATH './examples/files/kv1.txt' INTO TABLE pokes;
从 hdfs 导入数据到表格并覆盖原表
LOAD DATA INPATH
'/user/admin/SqlldrDat/CnClickstat/20101101/18/clickstat_gp_fatdt0/0'
INTO table c02_clickstat_fatdt1 OVERWRITE PARTITION (dt='20101201');
关于来源的文本数据的字段间隔符
如果要将自定义间隔符的文件读入一个表,需要通过创建表的语句来指明输入文件间隔符,
然后 load data 到这个表就 ok 了。
2.6 Insert
2.6.1 Inserting data into Hive Tables from queries
Insert 时,from 子句既可以放在 select 子句后,也可以放在 insert 子句前,下面两句是
等价的
hive> FROM invites a INSERT OVERWRITE TABLE events SELECT a.bar,
count(*) WHERE a.foo > 0 GROUP BY a.bar;
hive> INSERT OVERWRITE TABLE events SELECT a.bar, count(*) FROM invites
a WHERE a.foo > 0 GROUP BY a.bar;
hive 没 有 直 接 插 入 一 条 数 据 的 sql , 不 过 可 以 通 过 其 他 方 法 实 现 : 假设有一张表 B 至少有一条数据,我们想向表 A(int,string)中插入一条数据,可以用下面 的 方 法 实 现 : from B insert table A select 1,'abc' limit 1; 我觉得 hive 好像不能够插入一个记录,因为每次你写 insert 语句的时候都是要将整个表的值overwrite。我想这个应该是与 hive 的 storage layer 是有关系的,因为它的存储层是 HDFS,插入一个数据要全表扫描,还不如用整个表的替换来的快些。
mysql 也可以从一个表中查询数据插入到另一个表中,也可以一条数据的插入
Hive 不支持一条一条的用 insert 语句进行插入操作,也不支持 update 的操作。数据是以 load的方式,加载到建立好的表中。数据一旦导入,则不可修改。要么 drop 掉整个表,要么建立新的表,导入新的数据。
相关推荐
- ES6中 Promise的使用场景?(es6promise用法例子)
-
一、介绍Promise,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大在以往我们如果处理多层异步操作,我们往往会像下面那样编写我们的代码doSomething(f...
- JavaScript 对 Promise 并发的处理方法
-
Promise对象代表一个未来的值,它有三种状态:pending待定,这是Promise的初始状态,它可能成功,也可能失败,前途未卜fulfilled已完成,这是一种成功的状态,此时可以获取...
- Promise的九大方法(promise的实例方法)
-
1、promise.resolv静态方法Promise.resolve(value)可以认为是newPromise方法的语法糖,比如Promise.resolve(42)可以认为是以下代码的语...
- 360前端一面~面试题解析(360前端开发面试题)
-
1.组件库按需加载怎么做的,具体打包配了什么-按需加载实现:借助打包工具(如Webpack的require.context或ES模块动态导入),在使用组件时才引入对应的代码。例如在V...
- 前端面试-Promise 的 finally 怎么实现的?如何在工作中使用?
-
Promise的finally方法是一个非常有用的工具,它无论Promise是成功(fulfilled)还是失败(rejected)都会执行,且不改变Promise的最终结果。它的实现原...
- 最简单手写Promise,30行代码理解Promise核心原理和发布订阅模式
-
看了全网手写Promise的,大部分对于新手还是比较难理解的,其中几个比较难的点:状态还未改变时通过发布订阅模式去收集事件实例化的时候通过调用构造函数里传出来的方法去修改类里面的状态,这个叫Re...
- 前端分享-Promise可以中途取消啦(promise可以取消吗)
-
传统Promise就像一台需要手动组装的设备,每次使用都要重新接线。而Promise.withResolvers的出现,相当于给开发者发了一个智能遥控器,可以随时随地控制异步操作。它解决了三大...
- 手写 Promise(手写输入法 中文)
-
前言都2020年了,Promise大家肯定都在用了,但是估计很多人对其原理还是一知半解,今天就让我们一起实现一个符合PromiseA+规范的Promise。附PromiseA+规范地址...
- 什么是 Promise.allSettled()!新手老手都要会?
-
Promise.allSettled()方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的pr...
- 前端面试-关于Promise解析与高频面试题示范
-
Promise是啥,直接上图:Promise就是处理异步函数的API,它可以包裹一个异步函数,在异步函数完成时抛出完成状态,让代码结束远古时无限回掉的窘境。配合async/await语法糖,可...
- 宇宙厂:为什么前端离不开 Promise.withResolvers() ?
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.为什么需要Promise.with...
- Promise 新增了一个超实用的 API!
-
在JavaScript的世界里,Promise一直是处理异步操作的神器。而现在,随着ES2025的发布,Promise又迎来了一个超实用的新成员——Promise.try()!这个新方法简...
- 一次搞懂 Promise 异步处理(promise 异步顺序执行)
-
PromisePromise就像这个词的表面意识一样,表示一种承诺、许诺,会在后面给出一个结果,成功或者失败。现在已经成为了主流的异步编程的操作方式,写进了标准里面。状态Promise有且仅有...
- Promise 核心机制详解(promise机制的实现原理)
-
一、Promise的核心状态机Promise本质上是一个状态机,其行为由内部状态严格管控。每个Promise实例在创建时处于Pending(等待)状态,此时异步操作尚未完成。当异步操作成功...
- javascript——Promise(js实现promise)
-
1.PromiseES6开始支持,Promise对象用于一个异步操作的最终完成(包括成功和失败)及结果值的表示。简单说就是处理异步请求的。之所以叫Promise,就是我承诺,如果成功则怎么处理,失败怎...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- ES6中 Promise的使用场景?(es6promise用法例子)
- JavaScript 对 Promise 并发的处理方法
- Promise的九大方法(promise的实例方法)
- 360前端一面~面试题解析(360前端开发面试题)
- 前端面试-Promise 的 finally 怎么实现的?如何在工作中使用?
- 最简单手写Promise,30行代码理解Promise核心原理和发布订阅模式
- 前端分享-Promise可以中途取消啦(promise可以取消吗)
- 手写 Promise(手写输入法 中文)
- 什么是 Promise.allSettled()!新手老手都要会?
- 前端面试-关于Promise解析与高频面试题示范
- 标签列表
-
- hive行转列函数 (63)
- sourcemap文件是什么 (54)
- display none 隐藏后怎么显示 (56)
- 共享锁和排他锁的区别 (51)
- httpservletrequest 获取参数 (64)
- jstl包 (64)
- qsharedmemory (50)
- watch computed (53)
- java中switch (68)
- date.now (55)
- git-bash (56)
- 盒子垂直居中 (68)
- npm是什么命令 (62)
- python中+=代表什么 (70)
- fsimage (51)
- nginx break (61)
- mysql分区表的优缺点 (53)
- centos7切换到图形界面 (55)
- 前端深拷贝 (62)
- kmp模式匹配算法 (57)
- jsjson字符串转json对象 (53)
- jdbc connection (61)
- javascript字符串转换为数字 (54)
- mybatis 使用 (73)
- 安装mysql数据库 (55)