hive的数据操作的相关语法知识

²  Data Manipulation

1. Loading Data into Managed Tables:

LOAD DATA [ LOCAL ] INPATH '${env:HOME}/california-employees'

[ OVERWRITE ] INTO TABLEemployees

PARTITION (country = 'US', state = 'CA');

--(hive不核实你加载的数据是否符合表的模式,但是核实文件是否匹配表的定义。For example, if the table was created with  SEQUENCEFILE storage, the loaded files must be sequence files.)

ü 如果忽略LOCAL关键字,则移动分布式文件系统的数据到目的地,不省略则复制本地文件到目的地.

ü 只能在本filesystem集群使用 !!

ü 本地模式默认相对与用户的工作目录;对于伪分布式或分布式是相对于

/user/$USER

ü 如果指定OVERWRITE则先删除数据,再往里写;如果不指定,则是append.

ü 在文件路径上的使用限制, 这  INPATH子句的目标路径中不能包含任何目录或其他非文本文件(针对于存储格式为textfile来说)。

2. Inserting Data into Tables from Queries:

Ø INSERT[ OVERWRITE / INTO ]TABLE employees  

PARTITION (country = 'US', state = 'OR')

SELECT * FROM staged_employees se

WHERE se.cnty = 'US' AND se.st = 'OR';

ü OVERWRITE : 替换掉原来的数据(分区数据或整个不分区的表)

ü INTO : 附加到已有的表或分区后

Ø FROM staged_employees se

INSERT OVERWRITE TABLE employees

PARTITION (country = 'US', state = 'OR')

SELECT * WHERE se.cnty = 'US' AND se.st = 'OR'

INSERT OVERWRITE TABLE employees

PARTITION (country = 'US', state = 'CA')

SELECT * WHERE se.cnty = 'US' AND se.st = 'CA'

--(如果要插入的分区有多数个,那么hive会扫描staged_employees多数次,如果使用这个语法将会只扫描一次原表,在扫描过程中直接分裂为多数个ways)

ü 此语法中OVERWRITE INTO 可以混用

ü 此语法中既可以用PARTITION表也可以是非分区的表,混用亦可

ü 此语法中目的表可以是不同的表

3. Dynamic Partition Inserts:

hive> set hive.exec.dynamic.partition=true;

hive> set hive.exec.dynamic.partition.mode=nonstrict;

hive> set hive.exec.max.dynamic.partitions.pernode=1000;

INSERT OVERWRITE TABLEemployees

PARTITION (country, state)

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

FROM staged_employees se;

--(默认不开启动态插入功能,即使开启,默认也必须有静态的列,除非配置文件)

--(要实现此功能需)

ü PARTITION中没有值只有键,被视为动态分区插入,优势在于如果有大量分区要插入不需要一行一行的写每个分区

ü PARTITION中可以是动态分区与静态分区相结合,但是静态分区必须在动态分区之前

4. Creating Tables and Loading Them in One Query:

示例:

CREATE TABLE ca_employees

AS SELECT name, salary, address

FROM employees

WHERE se.state = 'CA';

Ø (相当于普通数据库中的视图,其中ca_employees中的列就是select中的列,主要用于创建子数据集)

Ø (但是不能用于创建external table

5.exporting data:

FROM staged_employees se

INSERT OVERWRITE DIRECTORY '/tmp/or_employees'

SELECT * WHERE se.cty = 'US' and se.st = 'OR'

INSERT OVERWRITE DIRECTORY '/tmp/ca_employees'

SELECT * WHERE se.cty = 'US' and se.st = 'CA'

Ø (可以理解为把 table 替换为 DIRECTORY

Ø (或者可用: hadoop fs -cp source_path target_path )

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值