您的位置:首页 > 其它

About Hive相关概念及HiveQL操作

2020-04-02 19:05 489 查看

博文目录

Hive Test

hive -e ‘’

[root@bdpdatanode01 ~]# hive -e 'select count(1) from prod_bdw.dwd_calendar'
[root@bdpdatanode01 ~]# hive -S -e 'select count(1) from prod_bdw.dwd_calendar'

hive 表(分区和桶)

1、托管表和外部表
2、分区和桶
1) 分区(partition):在文件块存储上进行细化,表现为文件夹树结构;

CREATE TABLE logs (ts BIGINT J line STRING)
PARTITIONED BY (dt STRING, count俨YSTRING);
LOAD DATA LOCAL INPATH 'i nput/hive/partitions/filel'
INTO TABLE logs
PARTITION ( dt:'20θ1-01-01', country:'GB');
show partitions tablename;

2)桶(bucket):会为数据提供额外的结构以获得更高效的查询处理。
把表(或分区)组织成桶(bucket)有两个理由。第一个理由是获得更高的查询处理效率。桶为表加上了额外的结构。Hive在处理有些查询时能够利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用map端连接(map-sidejoin)高效地实现。
首先,我们来看如何告诉Hive一个表应该被划分成桶。使用

CLUSTERED BY
子句来指定划分桶所用的列和要划分的桶的个数:

CREATE TABLE bucketed_user、s(id INT, name STRING)
CLUSTERED BY (id) INTO 4 BUCKETS;

在这里,我们使用用户ID来确定如何划分桶(Hive对值进行哈希井将结果除以桶的个数取余数。这样,任何一桶里都会有一个随机的用户集合。
对于map端连接的情况,首先两个表以相同方式划分桶,处理左边表内某个桶的mapper知道右边表内相匹配的行在对应的桶内。

把表划分成桶的第二个理由是使“取样”(sampling)更高效。在处理大规模数据集肘,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。
用TABLESAMPLE子句对表进行取样, 我们可以获得相同的结果。这个子句会将查询限定在表的一部分桶内, 而不是使用整个表:

hive> SELECT * FROM bucketed users
> TABLESAMPLE(BUCKET 1 OUT OF 4 ON id);

hive> select * from dwd_calendar limit 10;

hive 数据导入

1)、使用

LOADDATA
操作,通过把文件复制或移到表的目录中,从而把数据导入Hive的表(或分区)。

LOAD DATA LOCAL INPATH "input/ncdc/metadata/stations-fixed-width.txt"
INTO TABLE stations;

2)、也可以用

INSERT
语句把数据从一个Hive表填充到另一个表。

--单表插入
INSERT OVERWRITE TABLE target
[PARTITION ( dt=’2001-01-01’)]
SELECT coll, col2
FROM source;

--多表插入
FROM records2
INSERT OVERWRITE TABLE stations_by_year
SELECT year, COUNT(DISTINCT station)
GROUP BY year
INSERT OVERWRITE TABLE records_by_year
SELECT year, COUNT(l)
GROUP BY year
INSERT OVERWRITE TABLE good_records_by_year
SELECT year, COUNT(l)
WHERE temperature != 9999
AND (quality= 0 OR quality= 1 OR quality= 4 OR quality= 5 OR quality= 9)
GROUP BY year;

--或在新建表的时候使用CTAS结构,CTAS是CREATE TABLE ... AS SELECT的缩写 (CTAS是原子的,查询失败则不会建立表)
CREATE TABLE target AS
SELECT coll, col2
FROM source;

3)、把数据从一个关系数据库直接导人Hive,可以使用

Sqoop
或者
Spark sql

Hive修改表的HSQL几乎与SQL相同。

Hive 表的丢弃

1)

Drop table
删除托管表的数据和源数据;删除外部表的源数据;
2)删除表的数据,保留表的定义格式,如同关系数据库的truncate:
hive> dfs -rmr /user/hive/warehouse/my_table;

3)创建模式相同的表,之后Drop表:
CREATE TABLE new_table LIKE existing_table;

Hive 查询数据

hive> FROM records2
> SELECT year,temperature
> DISTRIBUTE BY year
> SORT BY year ASC,temperature DESC;

Hive 视图

CREATE VIEW valid records AS
SELECT *
FROM records2
WHERE temperature!= 9999
AND (quality= 0 OR quality= 1 OR quality= 4 OR quality= 5 OR quality= 9);

1)创建视图时并不执行查询,查询只是存储在metastore中。
2)SHOWTABLES命令的输出结果里包括视图。
3) 可以使用DESCRIBE EXTENDED νiew_name 命令来查看某个视图的详细信息,包括用于定义它的那个查询。
4) Hive中的视图是只读的,所以无法通过视图为基表加载或插入数据。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
ddttoop 发布了68 篇原创文章 · 获赞 3 · 访问量 1113 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: