ハイブプログラミングガイド-注-1

注:「ハイブ実際の戦闘実用ハイブハドゥープのデータウェアハウスシステムのガイド」(以下、ハイブ実際の戦闘と呼びます)も、
第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パーセント);から選択したデータブロックサンプリング

おすすめ

転載: blog.51cto.com/9990261/2551667