第5章HiveQL:数据操作

第5章HiveQL:数据操作

5.1 装载表数据

装在数据:“大量”的数据装载操作;OR 将文件写入到正确的目录下。

例:

LOAD DATA LOCAL INPATH '{$env:HOME }/California-employees'

​    OVERWRITE INTO TABLE employees

​    PARTITION BY (country = 'US' ,state = 'CA');
  • 若分区目录不存在,会自动创建,在拷贝数据到目录下;

  • 非分区表需要省略PARTITION字句;

  • 分区表需要使用PARTITION时,需要为每个分区的键指定一个值, PARTITION BY(键 = ‘值’),
    例 PARTITION BY ( country = ‘US’ ,state = ‘CA’ )

  • LOCAL为本地文件系统—>HDFS,没有LOCAL则为分布式文件系统(HDFS)

  • LOAD DATA不能从HDFS集群A到集群B

  • 全路径有更好的鲁棒性;相对路径在HIVE CLI中为启动时用户的工作目录;分布式or伪分布式为HDFS的根目录;

  • HIVE会验证文件格式与表结构定义是否一致

5.2 查询语句插入表数据

INSERT可以通过与查询语句SELECT结合向表中插入数据;

  • INSERT OVERWRITE 覆盖之前的数据;INSERT INTO 追加新增数据;存在于HIVE v0.8.0以后
  • 在表staged_employees中,使用不同的名字表示国家( cnty )和州( st )。
  • 下面语句需要对全表扫描,当表很大且需要对K个州执行,则需要全表扫描K次;
	INSERT OVERWRITE TABLE employees 	PARTITION (country =’US’, state =OR)
	SELECT * FROM staged_employees se
	WHERE se.cnty = ‘US’ AND se.st =OR;
  • 下面语句可改为对3个州做1次全表扫描;
FROM staged_employees se //提前创建子表,从这里取数据

INSERT OVERWRITE TABLE employees PARTITION (country =’US’, state =OR)

	SELECT * WHERE se.cnty = ‘US’ AND se.st =ORINSERT OVERWRITE TABLE employees PARTITION (country =’US’, state = ‘CA’)

	SELECT * WHERE se.cnty = ‘US’ AND se.st = ‘CA’

INSERT OVERWRITE TABLE employees PARTITION (country =’US’, state = ‘IL’)

	SELECT * WHERE se.cnty = ‘US’ AND se.st = ‘IL’

动态分区插入

  • 一个分区在HDFS中代表着1个目录文件
  • 动态分区需要配置以下参数
	Hive> set hive.exec.dynamic.partition = true; //开启动态分区
	Hive> set hive.exec.dynamic.partition.mode = nonstrict;//允许所有分区动态
	Hive> set hive.exec.max.dynamic.partitions.pernode = 1000;// mapper和reducer可以创建的最大分区个数
	其他参数
	set hive.exec.max.dynamic.partitions = 1000; 语句可创建的最大动态分区数
	set hive.exec.max.created.files = 100000; Hadoop全局可以创建的最大文件数
  • 源表字段值和输出分区的关系是根据位置匹配的

  • 静态分区键 必须在动态分区键前

INSERT OVERWRITE TABLE employees PARTITION (country =’US’, state )//静态+动态

SELECT, se.cnty ,se.st FROM staged_employees se 
WHERE se.cnty = ‘US’ 

5.3 查询数据并装载 到新创建表

  • 从一个大的宽表,选取需要的数据集

  • 该功能不能用于外部表

CREATE TABLE ca_employees

AS SELECT name, salary, address FROM employees WHERE se.state = ‘CA’;

5.4 导出数据

  1. Hadoop -fs -cp A_PATH B_PATH//文件格式符合需求可直接复制
  2. INSERT … DIRECTORY …
INSERT OVERWRITE LOCAL **DIRECTORY** '/tmp/ca_employees'//相对路径SELECT name, salary, address FROM employees 
	WHERE se.state = ‘CA’;
  • 被写入的文件个数取决于调用的reducer 的个数
  • HIVE会将字段序列化成字符串写入到文件中
  • 被写入的文件个数取决于调用的reducer 的个数
  • HIVE会将字段序列化成字符串写入到文件中
  • 使用ls/ tmp/ca_employees 查看文件是否存在;
  • 使用 cat /tmp/ca_employees/a_0 查看文件a_0的内容
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值