Guía de programación de Hive-Notes-1

Nota: "La colmena práctica de combate real de la colmena, una guía para el sistema de almacenamiento de datos de hadoop", en lo sucesivo denominada combate real de la colmena, también se ha agregado al
segundo capítulo, operaciones básicas
2.7 interfaz de línea de comandos (preste atención a los comandos ingresados ​​en la línea de comandos, esos son interfaz de entrada de colmena, seguida de comentarios la línea de comando es la entrada de línea de comando en la otra colmena se ejecuta)
2.7.1 Opciones de CLI
colmena --help --service entrada de línea de comandos de cli
2.7.2 variables y atributos
cuatro tipos de espacios de nombres: usuario de hivevar Variables personalizadas hiveconf propiedades de configuración relacionadas con la colmena sistema java propiedades de configuración entorno shell entorno definido variables de entorno
set env: HADOOP_HOME; - ver variables de entorno como HADOOP_HOME puede reemplazar HIVE_HOME. El env frontal es el
conjunto de espacios de nombres que muestra el entorno de los cuatro espacios de nombres anteriores El conjunto de variables -v muestra los atributos de 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; 

Capítulo 3 Tipo de datos y formato de archivo

3.1基本数据类型
    hive数据类型基本上都是对java中的接口实现。所以类型行为细节和java中的类型完全一致
3.2集合数据类型:struct,map,array 
3.3 文本文件数据编码(分隔符):ctrl+A  ctrl+B  ctrl+C  以及换行 \n 其中 换行 是行数据的分隔符。 
3.4读时模式:已理解 不赘述

Capítulo 4 Definición de datos
4.1 Base de datos en colmena

    查看所有数据库  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 ;

Capítulo 5 Operación de datos
5.1 Cargar datos en la tabla de administración
Preste atención a cómo usar la variable de entorno
hive -e "select * from stock_basic donde stock_id = 900920"> /tmp/stock_id_equal_900920.txt # Primero genere el
conjunto de archivos hiveconf: loc_txt = / tmp / stock_id_equal_900920.txt; #Tenga cuidado de no agregar comillas aquí
cargar datos local inpath '$ {hiveconf: loc_txt}' sobrescribir en la tabla stock_basic_partition partición (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

Capítulo VI consulta HiveQL
6.1 seleccione de la declaración
6.1.1 expresiones regulares para especificar esta columna es un campo estructurado muy triste
SELECT A, B. , De AA;
6.1.4 use las funciones
agregar funciones set hive.map.aggr = verdadero; La agregación en la fase de mapa consume mucha memoria
6.1.9 Qué situaciones se pueden evitar Las
consultas de Mapreduce generalmente desencadenan un mapreduce, pero en realidad es innecesario. Es decir, establecer el modo local:
establecer hive.exec.mode.local.auto = true
6.2 donde la declaración
6.2.2 Comparación de números de coma flotante
double 0.2 puede representar 0.200000010000 (12 bits) float 0.2 puede representar 0.20000000 (8 bits )
Por lo tanto, seleccione
desde stock_basic_partition donde stock_amount> 0.2 puede tener registros iguales a 0.2 y
necesita ser reescrito como select from stock_basic_partition donde stock_amount> cast (0.2 como float)
6.4 La
hive de instrucción join solo admite combinaciones de equivalencia y la cláusula on no puede aparecer o. Pero en aa = ba y ab> bb pueden aparecer
Cuando esté activado , coloque la tabla grande a la derecha porque hive se ejecuta de izquierda a derecha y almacena en caché la tabla de la
izquierda. La
semiunión izquierda está en o existe. El mapjoin optimizado no admite sentencias de unión derecha y unión completa.
6.5 Ordenar y ordenar por
orden Sí Ordenación global Todos los datos serán procesados ​​por un reductor Ordenar por es la clasificación en cada reducción
6.6 La distribución por
distribuir por con ordenar por controla cómo se divide la salida del mapa en la reducción. Porque reducir de acuerdo con las claves del mapa para distribuir uniformemente para reducir a un
resultado diferente en diferente reducción habrá cierta superposición. El uso de distribuir por garantizará que la misma clave se distribuya en el mismo
reductor . Por ejemplo, las existencias se distribuirán por stock_id ordenar por stock_id, stock_amount. Esto garantizará que la misma ID de stock esté junta.
seleccionar
de stock_basic_partition distribuir por stock_id ordenar por stock_id, stock_amount;
tenga en cuenta que distribuir por debe estar antes de ordenar por.
6.7 agrupar por.
Si los campos de ordenar por y distribuir por en 6.6 son iguales, se puede usar agrupar por
seleccionarAgrupar por STOCK_ID stock_basic_partition from;
6.9 muestra no entiende las consultas
según rand () aleatoriamente
SELECT
from stock_basic_partition TABLESAMPLE (bucket 10 ON of OUT. 3 rand ()); de
acuerdo con el campo aleatorio
SELECT from stock_basic_partition TABLESAMPLE (OUT of bucket 51 está ON. 3 STOCK_ID ); Selección de
muestreo de bloques de datos
de stock_basic tablesample (0,1 por ciento);

Supongo que te gusta

Origin blog.51cto.com/9990261/2551667
Recomendado
Clasificación