6. HiveシリーズのDMLデータ操作(2)

このステートメントは Mysql や PgSQL に似ています。簡単に説明します。

# 全表查询
select * from studen;
# 列查询
select name, age from student;
# 列别名
select name AS name1, age age1 from student;
# 常用函数 count max min sum avg等
select avg(score) avg_score from student;
# 限制返回的行数
select * from student limit 5;
# 薪水大于 1000 的所有员工
select * from emp where sal>1000;
# 查找名字中带有 A 的员工信息
select * from emp where ename RLIKE '[A]';
# 每个部门的平均薪水大于 2000 的部门
select deptno, avg(sal) avg_sal from emp group by deptno having avg_sal > 2000;
# 左外连接:JOIN 操作符左边表中符合 WHERE 子句的所有记录将会被返回
select e.empno, e.ename, d.deptno from emp e left join
dept d on e.deptno = d.deptno;
# 按照部门和工资升序排序
select ename, deptno, sal from emp order by deptno, sal;

1.各Reduceの内部ソート(Sort By)

並べ替え: 大規模なデータ セットの場合、並べ替えの効率は非常に低くなります。多くの場合、グローバル並べ替えは必要なく、現時点では並べ替え方法を使用できます。[並べ替え] では、各リデューサーの並べ替えファイルが生成されます。並べ替えはグローバル結果セットに対してではなく、各 Reducer で内部的に実行されます。

# 设置 reduce 个数
set mapreduce.job.reduces=3;
# 查看设置 reduce 个数
set mapreduce.job.reduces;
# 根据部门编号降序查看员工信息
select * from emp sort by deptno desc;

2. パーティション (配布者)

Distribute By: 場合によっては、通常は後続の集計操作のために、特定の行がどのリデューサーに送信されるかを制御する必要があります。これを実現できるのが、distribute by 句です。distribution by は MR のパーティション (カスタム パーティション) に似ており、パーティション化され、sort by と組み合わせて使用​​されます。
distribution byのテストでは複数のreduceを割り当てて処理する必要があり、そうしないとdistributebyの効果が見えません。

# 先按照部门编号分区,再按照员工编号降序排序
select * from emp distribute by deptno sort by empno desc;
➢ distribute by 的分区规则是根据分区字段的 hash 码与 reduce 的个数进行模除后,
余数相同的分到一个区。
➢ Hive 要求 DISTRIBUTE BY 语句要写在 SORT BY 语句之前

3. クラスター化

「distributed by」フィールドと「sorts by」フィールドが同じ場合、cluster by メソッドを使用できます。
また、cluster by には、distribute by の機能に加えて、sort by の機能もあります。ただし、並べ替えは昇順のみであり、並べ替えルールを ASC または DESC として指定することはできません。

# 以下两种写法等价
select * from emp cluster by deptno;
select * from emp distribute by deptno sort by deptno;

4. パーティションテーブルとバケットテーブル

4.1 パーティションテーブル

パーティション テーブルは実際には、HDFS ファイル システム上の独立したフォルダーに対応しており、その下に
パーティションのすべてのデータ ファイルが格納されます。Hive のパーティションはサブディレクトリであり、ビジネス ニーズに応じて大きなデータ セットを小さなデータ セットに分割します。クエリの際、WHERE 句の式で必要な指定されたパーティションを選択すると、クエリの効率が大幅に向上します。

# 创建分区表
create table dept_partition(deptno int, dname string, loc string)
partitioned by (day string) row format delimited fields terminated by '\t';
# 加载数据 分区表加载数据时,必须指定分区
load data local inpath '/opt/module/hive/datas/dept_20200403.log' into table dept_partition partition(day='20200403');
# 查询分区表中数据
select * from dept_partition where day='20200401';
# 增加分区
alter table dept_partition add partition(day='20200404');
# 删除分区
alter table dept_partition drop partition(day='20200404');
# 查看分区表有多少分区
show partitions dept_partition;
# 查看分区表结构
desc formatted dept_partition;

# 二级分区 如果一天的日志数据量也很大,将数据再拆分
create table dept_partition2(deptno int, dname string, loc string) partitioned by (day string, hour string) row format delimited fields terminated by '\t';
4.2 動的パーティション調整

リレーショナル データベースでは、パーティション テーブルにデータを挿入するとき、データベースは
パーティション フィールドの値に従って、対応するパーティションにデータを自動的に挿入します。Hive は同様のメカニズム、つまり動的パーティション (動的パーティション) も提供します。

# 开启动态分区功能(默认 true,开启)
hive.exec.dynamic.partition=true
# 设置为非严格模式(动态分区的模式,默认 strict,表示必须指定至少一个分区为
静态分区,nonstrict 模式表示允许所有的分区字段都可以使用动态分区。)
hive.exec.dynamic.partition.mode=nonstrict
# 在所有执行 MR 的节点上,最大一共可以创建多少个动态分区。默认 1000
hive.exec.max.dynamic.partitions=1000
# 在每个执行 MR 的节点上,最大可以创建多少个动态分区 该参数需要根据实际的数据来设定。比如:源数据中包含了一年的数据,即 day 字段有 365 个值,那么该参数就需要设置成大于 365,如果使用默认值 100,则会报错
hive.exec.max.dynamic.partitions.pernode=100
# 整个 MR Job 中,最大可以创建多少个 HDFS 文件。默认 100000
hive.exec.max.created.files=100000
# 当有空分区生成时,是否抛出异常。一般不需要设置。默认 false
hive.error.on.empty.partition=false
4.3 バケットテーブル

パーティションは、データを分離し、クエリを最適化するための便利な方法を提供します。ただし、すべてのデータセットが適切な
パーティションを形成するわけではありません。テーブルまたはパーティションの場合、Hive はさらにバケットに編成できます。つまり、より詳細なデータ範囲
分割
です。バケット化は、データ セットを管理しやすいいくつかの部分に分割するもう 1 つの手法です。パーティショニングは
ストレージを目的としています。データのパス。; バケット化は、データ ファイルのバケット化ルールを目的としています
。Hive のバケット化では、バケット化フィールドの値をハッシュし、バケットの数で割って余りを求め、レコードがどの
バケットに保存されているかを決定する方法が使用されます。

# 创建分桶表
create table stu_buck(id int, name string)
clustered by(id) into 4 buckets
row format delimited fields terminated by '\t';
# 查看表结构
hive (default)> desc formatted stu_buck;
Num Buckets: 4
# 导入数据到分桶表中,load 的方式
load data inpath '/student.txt' into table stu_buck;

バケットテーブル運用時の注意事項:

  • Reduce の数を -1 に設定し、使用する Reduce の数をジョブに決定させるか、Reduce の数を
    バケット テーブル内のバケットの数以上に設定します。
  • ローカル ファイルが見つからないという問題を回避するために、hdfs からバケット テーブルにデータをロードします。
  • ローカルモードを使用しないでください

5. サンプリングクエリ

select * from stu_buck tablesample(bucket 1 out of 4 on id);

おすすめ

転載: blog.csdn.net/SJshenjian/article/details/131742686