注:「ハイブ実際の戦闘実用ハイブハドゥープのデータウェアハウスシステムのガイド」(以下、ハイブ実際の戦闘と呼びます)も、
第2章の基本操作
2.7コマンドラインインターフェイスに追加されました(コマンドラインに入力されたコマンドに注意してください。ハイブ入力インターフェイスとそれに続く注釈コマンドラインは、他のハイブで実行されるコマンドライン入力です)2.7.1CLI
オプション
hive--help --service cliコマンドライン入力
2.7.2変数と属性
4種類の名前空間:hivevar userカスタム変数hiveconfhive関連の構成プロパティsystemjava構成プロパティenvシェル環境で定義された環境変数
setenv:HADOOP_HOME; -HADOOP_HOMEなどのビュー環境変数はHIVE_HOMEを置き換えることができます。フロントenvは
、上記の4つの名前空間の環境を示す名前付けセットです。変数セット-vはhadoopの属性を示します
hive --define foo=bar 命令行输入
hive> set foo ; --查看foo
set hivevar:foo; -- 将foo 给命名空间 hivevar (猜的)
set hivevar:foo=bar2; -- 改变foo 值
set hivevar:foo;
应用:create table toss1(i int, ${hivevar:foo} string); create table toss2(i int ,${foo} string);
set hivevar:foo=900920;
select * from stock_basic where stock_id=${hivevar:foo} limit 100;
设置默认显示hive数据库的名字
hive --hiveconf hive.cli.print.current.db=true;
或者: set hiveconf:hive.cli.print.current.db=true;
hive --hiveconf y=900920; 或者 set hiveconf:y=900920;
select * from stock_basic where stock_id=${hiveconf:y} limit 100;
system 可读可写,但是env 只能读不能写
set system:user.name;
set system:user.name=hadoop; # 没问题
set env:HOME;
set env:HOME=/home; #会报错。
2.7.3 hive 中一次使用命令:执行一个或者多个语句,之后立即退出hive 窗口
hive -e " select * from stock_basic where stock_id=900920 limit 100"; #命令行执行
也可以重定向 hive -e " select * from stock_basic where stock_id=900920 limit 100" > /tmp/stock_id.txt
应用:可以用来查看记忆模糊的属性
hive -S -e "set" | grep warehouse # -S 代表静默模式 会去掉 ok time taken 等字段 其实加不加都无所谓。不加 这些无关字段也不出现
2.7.4 从脚本中执行hsql
hive -f /tmp/hsql.hql #命令行执行;
或者 在hive 里面 执行 source /tmp/hsql.hql
2.7.5 hiverc文件
在$HOME 下 新建 .hiverc 文件 每次开发 cli 都会先去执行 hiverc文件里的语句,这样将系统变量和其他属性加入到这个文件,默认执行就方便多了
2.7.6 补全 tab
2.7.7 查看历史 hive 会将行命令记录到$home/.hivehistory 下 也可以上下键查看
2.7.8 执行 shell命令 ! pwd
2.7.9 执行 hadoop dfs命令 dfs -ls /;
2.7.10 注释 --
2.7.11 设置默认显示表的字段的名字
set hive.cli.print.header=true;
第3章データタイプとファイル形式
3.1基本数据类型
hive数据类型基本上都是对java中的接口实现。所以类型行为细节和java中的类型完全一致
3.2集合数据类型:struct,map,array
3.3 文本文件数据编码(分隔符):ctrl+A ctrl+B ctrl+C 以及换行 \n 其中 换行 是行数据的分隔符。
3.4读时模式:已理解 不赘述
第4章データ定義
4.1ハイブ内のデータベース
查看所有数据库 show databases; 或者
show databases like 'financials*';
创建数据库
create database if not exists financials4 comment 'all financials table '
location 'hdfs://master:9000/hive_dir/financials4.db'
with dbproperties('creator'='zhangyt','date'='2020-10-08');
#hdfs://master:9000 是hadoop 默认设置的路径 见core-site.xml。 hive_dir 是hive设置的 hive 在hdfs上的路径 见 hive-site.xml
describe database financials2; 或者 describe database extended financials2; #查看更详细信息 主要看第三种建数据库的方式的信息
使用数据库 use financials;
删除数据库 drop database financials2; #没有表可以这样删除 drop database financials2 cascade; #有表必须加 cascade
4.2 修改数据库 只能修改属性信息 元数据信息不能修改
alter database financials3 set dbproperties('edited-by'='zhangyt1');
4.3 创建表
create table stand_table_1 like stand_table;#注意表属性:如果原表是分区表 目标表也会是分区表
create [external] table [if not exists ]stand_table(stand_a string comment 'A 列 ',stand_b int comment 'column b')
comment 'this is a stand table '
row format delimited fields terminated by '\t'
lines terminated by '\n'
stored as textfile
location '/hive_dir/stand_table'
#row format delimited 必须要在 其他子句之前
# location 可以指定别的路径 不指定就默认 到 hive-site.xml 路径去了
# 如果有 location 和 stored as textfile 则 stored as textfile 必须要在 location 前面
# tblproperties('creator'='zhangyt','date'='2020-10-08')加不进去
查看表 show tables; 或者 show tables in financials2 ; # in后面是数据库 show tables 'stock*' ; #模糊查询
describe stand_table;
describe extended stand_table;
load data [local] inpath '/tmp/hive_txt/ss.txt' [overwrite] into table ss_l;
load data inpath '/input/ss.txt' overwrite into table ss;
# 这样写 这个地址 是 hdsf 地址 注意这是移动,移动之后 原来的目录下的文件就被移动到 hive 的 文件目录下去了
load data local inpath '/tmp/hive_txt/ss.txt' overwrite into table ss_l;
# 这样写 地址 是本地地址 虽然是移动,但是 本地文件还在
之所以会有上面文件存在于不存在的差异 是因为 hdfs上已经是分布式式文件系统了,不需要多份拷贝
4.4分区表,管理表
create table if not exists stock_basic_partition(
stock_name string comment '股票名称'
,stock_date string comment '股票日期'
,stock_start_price DECIMAL(15,3) comment '开盘价'
,stock_max_price DECIMAL(15,3) comment '最高价'
,stock_min_price DECIMAL(15,3) comment '最低价'
,stock_end_price DECIMAL(15,3) comment '收盘价'
,stock_volume DECIMAL(15,3) comment '成交量'
,stock_amount DECIMAL(15,3) comment '成交金额')
comment 'stock_ basic infomation '
partitioned by (stock_id string )
row format delimited fields terminated by ','
lines terminated by '\n'
stored as textfile
location '/hive_dir/stock_basic_partition';
注:hive实战中的:hive分区对于特别的子查询可以改进其性能,可以对不需要的查询结果的分区进行剪枝:该过程称为分区消除
分区遵守的原则:(暂时不理解)
挑选一列作为分区键,其唯一值个数应该在低值和中间值之间
避免分区小于1GB
当分区数量较多,调整hiveserver2和hive metastore的内存
当时用多列作为分区键的时候,对于每一个分区键的组合都要创建一个子目录的嵌套树。应该避免深入嵌套,因为这会导致太多的分区
当使用hive流处理插入数据,如果多个会话向相同的分区写入数据会导致锁闭。流处理参见6.5:hive流处理:hive的流的api主要作为hive bolt与storm一起使用。 暂时没用到。。
#表的 备注必须放在 partitioned by (stock_id string ) 前面
查看分区 show partitions stock_basic_partition; describe extended stock_basic_partition;
#注意格式 分区字段要放最后
insert overwrite table stock_basic_partition partition ( stock_id ) select
stock_name
,stock_date
,stock_start_price
,stock_max_price
,stock_min_price
,stock_end_price
,stock_volume
,stock_amount
,stock_id
from stock_basic
limit 200000;
要在非严格模式下才行
load data local inpath '/tmp/stock_id.txt' into table stock_basic_partition partition (stock_id='900920');
设置严格模式 使得 分区表必须加分区 set hive.exec.dynamic.partition.mode=strict ; 设置非严格模式 set hive.exec.dynamic.partition.mode=nonstrict ;
严格模式下 分区表也可以不用指定分区。
4.5 删除表 drop table stock_basic_partition; 外部表 只是删除元数据 真实数据文件还在
4.6 修改表
特别注意 修改表 只是修改元数据 但是真实数据并没该表 需要自己对应修改真实数据文件
修改表名 alter table stock_basic_test rename to stock_basic_test1;
增加分区 alter table stock_basic_partition add if not exists partition (stock_id='00000001') location '/hive_dir/stock_basic_partition/00000001'
partition (stock_id='03000001') location '/hive_dir/stock_basic_partition/03000001';
删除分区 分区 这个语句暂时发现只能删除一个分区
alter table stock_basic_partition drop if exists partition (stock_id='00000001') ;
更改列的位置 报错 不行
alter table stock_basic_test CHANGE COLUMN stock_amount DECIMAL(15,3) comment '成交金额' AFTER stock_id ;
增加列
alter table stock_basic_test add COLUMNS ( stock_other string COMMENT '其他信息');
删除列/替换列
将 stock_volume 删除了 就是将不要的字段删掉,但是保证删掉后的数据 往前挪的时候类型正确。而且数据也要删除
综上 其实删除列没什么用 太麻烦。
alter table stock_basic_test replace columns (
stock_id string
,stock_name string comment '股票名称'
,stock_date string comment '股票日期'
,stock_start_price DECIMAL(15,3) comment '开盘价'
,stock_max_price DECIMAL(15,3) comment '最高价'
,stock_min_price DECIMAL(15,3) comment '最低价'
,stock_end_price DECIMAL(15,3) comment '收盘价'
,stock_amount DECIMAL(15,3) comment '成交金额');
create table stock_basic_test as select * from stock_basic limit 2000;
修改表属性
alter table stock_basic_test set tblproperties('notes'='hahaha');
附:《hive实战 practical hive a guide to hadoop's data warehouse system 》以下简称 hive实战 4.4.6 表的属性中
重要的表的属性:last_modified_user,last_modified_time, immutable,orc.compress,skip.header.line.count
1.immutable 使用: 当该属性被设置为true 则如果表不为空,无法插入数据。
create table stock_basic_test_immutable like stock_basic ;
insert into stock_basic_test_immutable select * from stock_basic limit 100;
alter table stock_basic_test_immutable set tblproperties('immutable'='true');
## 试试是否可以插入
insert into stock_basic_test_immutable select * from stock_basic limit 100; ## 失败
alter table stock_basic_test_immutable set tblproperties('immutable'='false');
insert into stock_basic_test_immutable select * from stock_basic limit 100; ## 成功
2.skip.header.line.count
create table stock_basic_test_skip(a string ,b string) row format delimited fields terminated by ',' lines terminated by '\n' ;
alter table stock_basic_test_skip set tblproperties('skip.header.line.count'='1');
load data local inpath '/tmp/stock_basic_test_skip.txt' overwrite into table stock_basic_test_skip; #实验可行
skip.header.line.count 去除数据的表头:是hive外部表的重要特性之一
修改存储属性
alter table stock_basic_test set fileformat sequencefile ; sequencefile 可以替换成 textfile
alter table stock_basic_partition partition (stock_id='600909' )set fileformat sequencefile ;
4.6.8众多修改表语句
钩子 看不懂(略去)
将分区文件(只能用于分区)成一个 hadoop压缩包(har文件) 可以降低文件数 从而减少namenode压力但是不会减少 压缩空间
前提: 开启模式 set hive.archive.enabled=true;
如果报错 java.lang.NoClassDefFoundError: org/apache/hadoop/tools/HadoopArchives
需要将 hadoop的lib目录下的 hadoop-archives-3.1.2.jar 复制到hive的lib目录下即可
alter table stock_basic_partition archive partition ( stock_id ='600908');
反之
alter table stock_basic_partition unarchive partition ( stock_id ='600908');
压缩后可以进去hdfs页面看hive 目录下该文件的方式,有点意思
保护分区 防止被删除 和查询 报错 下次看 百度下没法解决
alter table stock_basic_partition partition( stock_id ='600908')enable no_drop;
alter table stock_basic_partition partition ( stock_id ='600908') enable offline ;
第5章データ操作
5.1管理テーブルへのデータのロード
環境変数
hive-e "select * from stock_basic where stock_id = 900920"> /tmp/stock_id_equal_900920.txtの使用方法に注意してください#最初にファイル
セットhiveconf:loc_txt = / tmp /を生成しますstock_id_equal_900920.txt;#ここに引用符を追加しないように注意してください。
ロードデータローカルインパス '$ {hiveconf:loc_txt}'をテーブルstock_basic_partitionパーティション(stock_id = '900920')に上書きします。
注意 如果没有 overwrite 而新加入的文件和表原有的文件 名字一样,则会增加文件编号 如:stock_id_equal_900920.txt stock_id_equal_900920_copy_1.txt
5.2通过查询向表里插入数据
insert into table stock_basic_partition
partition( stock_id=900922)
select * from stock_basic where stock_id=900922;
#这样写是错的。特别注意
insert into table stock_basic_partition
partition( stock_id=900922)
select
stock_name
,stock_date
,stock_start_price
,stock_max_price
,stock_min_price
,stock_end_price
,stock_volume
,stock_amount
from stock_basic where stock_id=900922;
#验证了华为考试题 插入语句select 字段会比分区表表的字段少,少的是分区字段
动态插入 如果按照上面一个一个写,太慢了
set hive.exec.dynamic.partition.mode=nonstrict #设置为非严格模式
#注意格式 分区字段要放最后
insert overwrite table stock_basic_partition partition ( stock_id ) select
stock_name
,stock_date
,stock_start_price
,stock_max_price
,stock_min_price
,stock_end_price
,stock_volume
,stock_amount
,stock_id
from stock_basic ;
要在非严格模式下才行
动态分区属性其他百度
hive.exec.dynamic.partition
hive.exec.dynamic.partition.mode
5.3 单个查询语句创建表并且加载数据 ctas
create table as select from
《hive实战》:ctas目标表无法是 外部表,分区表,分桶表 结论:正确,虽然来源表是分区表 但是目标表已经不是分区表了,和like 不同
create table stock_basic_partition_ctas as select * from stock_basic_partition;
5.4 导出数据 注意 这是hdfs 上 不是本地
如果文件格式刚好合适直接导出
hadoop fs -cp source_path target_path
hadoop fs -cp hdfs://master:9000/hive_dir/date_stock /tmp/data_from_hive #命令行
#不行。。
insert overwrite local directory '/tmp/data_from_hive' select * from date_stock; #hive 界面 这个生成的目录很怪
和插入对应输出也可以输入到不同的文件夹
from stock_basic_partition sp
insert overwrite directory '/tmp/600896'
select * where stock_id=600896
insert overwrite directory '/tmp/600897'
select * where stock_id=600897
insert overwrite directory '/tmp/600898'
select * where stock_id=600898
第VI章HiveQLクエリ
6.1ステートメントから選択
6.1.1この列を指定するための通常の式は非常に悲しい構造化フィールドですSELECTA
、B。、AAから;
6.1.4関数
aggregatefunctionsethive.map.aggrを使用します。= true;マップフェーズでの集約は大量のメモリを消費します
。6.1.9回避できる状況。Mapreduce
クエリは通常mapreduceをトリガーしますが、必須ではありません。つまり、ローカルモードを設定します
。sethive.exec.mode.local.auto= true
6.2ここで、ステートメント
6.2.2浮動小数点数の比較
double 0.2は0.200000010000(12ビット)を表す場合がありますfloat 0.2は0.20000000(8ビット)を表す場合があります)
したがって、 stock_amount> 0.2のレコードが0.2に等しい可能性があり、stock_amount> cast(0.2 as float)の
select from stock_basic_partitionとして書き換える必要があるstock_basic_partitionから選択します。6.4join
ステートメント
ハイブは等価結合のみをサポートし、on句は表示できません。しかし、aa = baおよびab> bbに表示される可能性があります
オンの場合、ハイブは左から右に実行され、左のテーブルをキャッシュするため、大きなテーブルを右に配置します。
左の半結合が存在するか、存在します。最適化された
mapjoinは、右の結合および完全な結合ステートメントをサポートしません。6.5
並べ替えと並べ替え
はいグローバルソートすべてのデータはレデューサーによって処理されます。ソートバイは、各リデュースでのソートです
。6.6ソートバイによる
配布は、マップの出力がリデュースでどのように分割されるかを制御します。マップのキーに従ってreduceを均等に分散して別の
結果に縮小するため、異なるreduceでは一部の重複が発生します。配布方法を使用すると、同じキーが同じリデュースに配布されます。たとえば
、株式はstock_idで配布され、stock_id、stock_amountで並べ替えられます。これにより、同じ株式IDが一緒になります。
選択元stock_basic_partition配布元stock_id並べ替えstock_id、stock_amount;
配布方法は並べ替えの前に行う必要があることに注意してください。6.7
クラスター化
。6.6の並べ替えと配布のフィールドが同じ場合は、
選択によるクラスター化を使用できます。STOCK_IDによるクラスターstock_basic_partitionfrom;
6.9サンプルは
rand()によるクエリを理解しないstock_basic_partition TABLESAMPLEからランダムに
SELECT(バケット10 ONofOUT。3rand());
ランダムフィールド
SELECT from stock_basic_partition TABLESAMPLE(バケット51からOUTはON。3STOCK_ID );
stock_basic tablesample(0.1パーセント);から選択したデータブロックサンプリング