HIVESQL语法及相关问题集锦

1、函数: 2020 4 转为 202004

concat(kjnd,lpad(kjqj,2,‘0’))

2、hive中导入数据:

提前建好表,制定字段分隔符
LOAD DATA [local] INPATH '/workspace/bpUserinfo_201511.log'  INTO table testkv;

3、建表制定null值存储格式:
hive表:
null默认的存储都是\N,可以在建表时通过serialization.null.format=’’ 的设置,设置为’’
hive parquet格式压缩:

创建parquet table :
create table tabname(a int,b int) STORED AS PARQUET;

创建带压缩的parquet table:
create table tabname(a int,b int) STORED AS PARQUET TBLPROPERTIES('parquet.compression'='SNAPPY');

如果原来创建表的时候没有指定压缩,后续可以通过修改表属性的方式添加压缩:
ALTER TABLE tabname SET TBLPROPERTIES ('parquet.compression'='SNAPPY');
或者在写入的时候
set parquet.compression=SNAPPY;


建表制定分隔符: 

CREATE external TABLE `table1`(
  `name` string COMMENT '姓名',
  `id` int COMMENT 'ID'
)
PARTITIONED BY (
     `province_id` int,
     `day` int)
ROW FORMAT SERDE
  'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
  'field.delim'=',',
  'serialization.format'=',')
STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';
  -- 以字段间以“,”为分隔符,行间以tab为分隔符
     
ROW FORMAT SERDE
  'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
  'field.delim'='|',
  'serialization.format'='|')
STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';
  -- 以字段间以“|”为分隔符,行间以tab为分隔符

建表指定分隔符:
create  table if not exists stu2(id int ,name string) row format delimited fields terminated by '\t' stored as textfile location '/user/stu2';

4、hive脚本参数优化

set hive.exec.dynamic.partition.mode = true;  --使用动态分区时,设置为ture。
set hive.exec.dynamic.partition.mode = nonstrict;  --动态分区模式,默认值:strict,表示必须指定一个分区为静态分区;nonstrict模式表示允许所有的分区字段都可以使用动态分区。一般需要设置为nonstrict。
set hive.exec.max.dynamic.partitions.pernode =10;  --在每个执行MR的节点上,最多可以创建多少个动态分区,默认值:100。
set hive.exec.max.dynamic.partitions =1000;  --在所有执行MR的节点上,最多一共可以创建多少个动态分区,默认值:1000。
set hive.exec.max.created.files = 100000;  --整个MR Job中最多可以创建多少个HDFS文件,默认值:100000。
控制Mapper的数量:
set hive.error.on.empty.partition = false;  --当有空分区产生时,是否抛出异常,默认值:false。
set mapred.max.split.size=100000000;   -- 决定每个map处理的最大的文件大小,单位为B
set mapred.min.split.size.per.node=100000000;   -- 节点中可以处理的最小的文件大小
set mapred.min.split.size.per.rack=100000000;   -- 机架中可以处理的最小的文件大小
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;  ---实现map中的数据合并需要设置下面的参数,集群默认就是这个格式
不指定Reduce的个数的情况下,Hive会猜测确定一个Reduce个数,由下面两个参数决定:
    1、hive.exec.reducers.bytes.per.reducer(每个reduce任务处理的数据量,默认为1000^3=1G) 
    2、hive.exec.reducers.max(每个任务最大的reduce数,默认为999set hive.execution.engine=tez;
set hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
set hive.merge.mapredfiles = true ;
set hive.exec.reducers.bytes.per.reducer=128000000;
set hive.merge.size.per.task = 128000000;
set hive.exec.parallel=true; 
set hive.exec.parallel.thread.number=6;
set hive.auto.convert.join=false;
set mapreduce.map.memory.mb=10150;
set mapreduce.map.java.opts=-Xmx2048m;
set mapreduce.reduce.memory.mb=10150;
set mapreduce.reduce.java.opts=-Xmx2048m;

hive 查询 impala 生成parquet格式的数据时,可能会因为底层数据不均造成查询报错,可通过一下参数调优:

set hive.execution.engine=mr;
set mapreduce.map.memory.mb=6144;
set mapreduce.map.java.opts=-Xmx4096m;  
set mapreduce.input.fileinputformat.split.maxsize=1024000000;
set mapreduce.input.fileinputformat.split.minsize=1024000000;
set mapred.max.split.size=1024000000;
set mapred.min.split.size.per.node=1024000000;
set mapred.min.split.size.per.rack=1024000000; 
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
set parquet.memory.min.chunk.size=100000; # parquet文件格式配置
set mapreduce.reduce.memory.mb=8192;
set mapreduce.reduce.java.opts=-Xmx6144m;

合并小文件

1. Map输入合并小文件
对应参数:
set mapred.max.split.size=256000000;  #每个Map最大输入大小
set mapred.min.split.size.per.node=100000000; #一个节点上split的至少的大小 
set mapred.min.split.size.per.rack=100000000; #一个交换机下split的至少的大小
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;  #执行Map前进行小文件合并
在开启了org.apache.hadoop.hive.ql.io.CombineHiveInputFormat后,一个data node节点上多个小文件会进行合并,合并文件数由mapred.max.split.size限制的大小决定。
mapred.min.split.size.per.node决定了多个data node上的文件是否需要合并~
mapred.min.split.size.per.rack决定了多个交换机上的文件是否需要合并~

2.输出合并
set hive.merge.mapfiles = true #在Map-only的任务结束时合并小文件
set hive.merge.mapredfiles = true #在Map-Reduce的任务结束时合并小文件
set hive.merge.size.per.task = 256*1000*1000 #合并文件的大小
set hive.merge.smallfiles.avgsize=16000000 #当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge

5、批量导出hive建表语句的脚本

#!/bin/bash
for hiveTabName in $(hive -e "show tables from datax;")
do
hive -e "show create table datax.${hiveTabName};" >>tablesDDL.txt
echo -e "---------------------------- $hiveTabName table structure generate finished! -------------------------------\n\n">>tablesDDL.txt
done

6、HIVE增删改字段、增删分区、加载数据

hive表增字段:
 alter table detail_flow_test add columns(original_union_id string);
hive表删字段:
// 删除字段(使用新schema替换原有的)
ALTER TABLE test REPLACE COLUMNS(id BIGINT, name STRING);
hive表修改字段:
 alter table fct_user_ctag_today CHANGE COLUMN rpt_tag rpt_tag int comment ' ';
备注:增删改hive表后需要删除分区,重新添加元数据才可生效

hive表添加分区:
alter table  ads.ads_dingding_bill_info_d  add if  not  exists    partition (dt = '${pd_date}')   location '/apps/data/warehouse/ads/ads_dingding_bill_info_d/dt=${pd_date}'  ;
hive表删除分区:
alter table  ads.ads_dingding_bill_info_d  drop if  exists    partition (dt = '${pd_date}')  ;


load数据:
LOAD DATALOCAL】 INPATH '/home/admin/test/test.txt' OVERWRITE INTO TABLE test_1 PARTITION(pt=’xxxx)

合并小文件脚本

#!/bin/bash

pd_date=$1

#ng日志接入hdfs的存储目录
ng_log_dir=/init/data/warehouse/tmp/safe_interface/${pd_date}

#测试今日路径下是否存在.json文件,如重跑不会删除已存在表的数据
hadoop fs -test -f  ${ng_log_dir}/*.json

if [ $? -eq 0 ] ;then 
    echo ----------日期:${pd_date} ----------
    echo 'ng日志存在,执行数据加载任务' 
hive  -e  "LOAD DATA INPATH  '/init/data/warehouse/tmp/safe_interface/${pd_date}/safe_interface_*.json'   OVERWRITE INTO TABLE log_ods.ods_tmp_safe_interface_log; "
hive  -e  "set mapred.max.split.size=2147483648; set mapred.min.split.size.per.node=100000000; set mapred.min.split.size.per.rack=100000000;	set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;  INSERT OVERWRITE table log_ods.ods_safe_interface_log  partition(dt='${pd_date}')  SELECT   *  from  log_ods.ods_tmp_safe_interface_log ; "
else 
    echo ----------日期:${pd_date} ----------
    echo 'ng日志不存在,请查看是否已加载过数据'
fi
--hivesql合并小文件,仅设置map端参数即可,因为select *  做操作不产生reduce任务
set mapreduce.map.memory.mb=1024;
set mapreduce.map.java.opts=-Xmx1024m;  
set mapred.max.split.size=512000000;  		--一个map读取的文件大小	
set mapred.min.split.size.per.node=100000000;	
set mapred.min.split.size.per.rack=100000000; 	
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;  

insert overwrite table log_ods.ods_***** 
partition(dt = '${pd_date}' )
select   *  
 from  log_ods.ods_*****
where dt = '${pd_date}'
;

7、Hive脚本的头信息及创表模本
头信息

--Title:管理报表
--Target:   ads.ads_byd_***********_d  
--Description: 工作进度统计表
--Source:
--Author: ndndnl
--CreateDate: 202101-28
--UpdateDate: 

--指定hive执行引擎及资源
set hive.execution.engine=mr;
set mapreduce.map.memory.mb=6144;
set mapreduce.map.java.opts=-Xmx4096m;  
set mapreduce.reduce.memory.mb=8192;
set mapreduce.reduce.java.opts=-Xmx6144m;
--禁用hive的mapjoin,默认开启,默认表小于25mb则开启mapjoin
--set hive.auto.convert.join=false;
--#map端合并,控制map阶段task数
set mapred.max.split.size=256000000;  						--每个Map最大输入大小
set mapred.min.split.size.per.node=100000000;		-- 一个节点上split的至少的大小 
set mapred.min.split.size.per.rack=100000000; 		--一个交换机下split的至少的大小
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;  			--执行Map前进行小文件合并
--reduce阶段小文件合并,控制生成表的文件大小
set hive.merge.mapfiles = true ; 										--#在Map-only的任务结束时合并小文件
set hive.merge.mapredfiles = true ;								--#在Map-Reduce的任务结束时合并小文件
set hive.merge.smallfiles.avgsize=16000000 ;				--#当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge
set hive.merge.size.per.task = 256000000;			--#合并文件的大小(生成文件大小256m)


--【hive创建临时表默认使用textfile格式,如果有字段值有换行符会造成数据串行数据量增大等问题,建议显示指定使用PARQUET格式】
--创建临时表
drop table if exists default.tmp_dwb_acloud_kp_info_diff_01;
create table default.tmp_dwb_acloud_kp_info_diff_01 
STORED AS PARQUET 
as 
select  

--结果表落地
alter table ads.ads_xxxxxxxxxxx  drop if exists partition (dt = '${pd_date}')  ;
alter table ads.ads_xxxxxxxxxxx  add if not exists partition (dt='${pd_date}')    location '/apps/data/warehouse/ads/ads_xxxxxxxxxxx/dt=${pd_date}' ;
insert overwrite table ads.ads_xxxxxxxxxxx
partition (dt = '${pd_date}') 



--删除临时表(可不加)
drop table if exists default.tmp_dwb_acloud_kp_info_diff_01;

8、SQL函数

1left joinonwhere条件过滤的执行顺序
select * from a left join b on a.id = b.id  where 过滤条件
--参考链接: https://blog.csdn.net/weixin_42903419/article/details/105845410
(1) 如果是对左表(a)字段过滤数据,则可以直接写在where后面,此时执行的顺序是:先对a表的where条件过滤数据然后再join b 表
(2) 如果是对右表(b)字段过滤数据,则应该写在on 条件后面或者单独写个子查询嵌套进去,这样才能实现先过滤b表数据再进行join 操作;
如果直接把b表过滤条件放在where后面,执行顺序是:先对a表数据过滤,然后和b表全部数据关联之后,在reduce 阶段才会对b表过滤条件进行过滤数据,此时如果b表数据量很大的话,效率就会很低。因此对于应该在map 阶段尽可能对右表进行数据过滤。
(3)至于是否全表扫描取决于是否对表的分区字段过滤。这个具体从业务方面考虑是否需要对分区过滤,要想sql 高效那么尽可能在map阶段将不需要的数据过滤,减少后面资源的占用,提高效率

2left semi joinleft semi join中,关联右侧的表只能在on中设置过滤条件,在whereselect或其他地方均不可出现。这主要是因为left semi join只会传递关联条件中key给每一个map,这导致了查询结果中只会出现左侧表中的字段,如果出现右表的字段则会报错。
在left semi join时,功能等同于a.key in (b.keyset)。当右表的key存在重复数据时,会直接跳过,不会重复关联。因此不会产生笛卡尔积。

left semi joinin的功能基本相同,上面的left semi join案例可以用in达到一样的效果:

--参考链接: https://blog.csdn.net/u011517132/article/details/103620209?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control

2、求 并集、补集、差集、交集
并集:  union allunion   
补集:left join   右表为null  右表不存在  
差集:union all  后主键分组后count(1=1的为左右两表的差集
交集:  joinleft  semi joinin    

3、NTILE(n) 函数
用于将分组数据按照顺序切分成n片,返回当前切片值

 ntile(3) over() as sample1 , --全局数据切片
 ntile(3) over(partition by name), -- 按照name进行分组,在分组内将数据切成3份
 ntile(3) over(order by cost),--全局按照cost升序排列,数据切成3份
 ntile(3) over(partition by name order by cost ) --按照name分组,在分组内按照cost升序排列,数据切成3份

4、开窗函数   rows between …… and ……
unbounded preceding 起始行
unbounded following 结尾行
current row 当前行
1 preceding11 following1行
示例:
rows between unbounded preceding and unbounded following             -- 表示起始行到末尾行(分组范围内)
--分组排序后逐条累加
sum(gl_pzx.k_jf + gl_pzx.k_df) over(partition by gl_pz.k_ztdm, gl_pz.k_kjnd, gl_pz.k_kjqj, gl_pzx.k_kmnm,gl_pzx.k_bzid order by gl_pz.K_LSH, gl_pzx.K_ROW rows between UNBOUNDED PRECEDING and current row) as balance, -- 凭证的累加发生额

**若要用到取今天和昨天的某字段差值时**
 Offset是偏移量,即是上1个或上N个的值,假设当前行在表中排在第5行,则offset3,则表示我们所要找的数据行就是表中的第2行(即5-3=2)。
salary, LAG(salary, 1, 0) OVER(PARTITION BY user_name ORDER BY salary_vaild_date) AS last_salary      ---往前差值行  
lead(exp_str,offset,defval) over(partion by ..order by)       --往后差值行 

5、自定义udf函数

永久函数:
CREATE FUNCTION hadoop.gps_to_bd AS 'cn.hive.Gps_to_Bd' USING JAR 'hdfs://ns1//hive/private/lib/gps_to_bd.jar';
临时函数:
add jar hdfs://ns1//hive/private/lib/gps_to_bd.jar;
CREATE TEMPORARY FUNCTION gps_to_bd AS 'cn.hive.Gps_to_Bd';
删除函数:
drop function db_name.fun_name ;

查看自定义或内置函数:

1 查看所有的函数:
show functions;
2. 查看date相关的函数:(模糊查询)
show functions like 函数名 
示例:show functions like '*date*' (模糊查询)
3.粗粒度查看函数的使用方法:
desc function 函数名
示例:desc function round;
4. 细粒度查看函数使用方法:
desc function extended 函数名
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Hive SQL语法树解析工具是一个用于解析Hive SQL语句的工具,它能够将输入的Hive SQL语句转换成一棵语法树,便于后续的语义分析和优化处理。 该工具的主要作用是对Hive SQL语句进行解析和分析,将其转换成一种抽象的语法树表示形式。语法树是一种树状结构,其中每个节点表示SQL语句中的一个元素,例如关键字、表名、列名、运算符等。通过解析Hive SQL语句并构建语法树,可以使得对SQL语句的解析和处理更加方便和灵活。 在Hive中,通过使用ANTLR等工具,可以实现Hive SQL语法树的解析操作。ANTLR是一种强大的解析器生成器,可以根据给定的语法规则自动生成解析器。通过编写Hive SQL语法的ANTLR规则,我们可以使用ANTLR工具生成相应的解析器,然后利用该解析器对Hive SQL语句进行解析和分析。 使用Hive SQL语法树解析工具,可以实现以下功能: 1. 将Hive SQL语句解析成语法树,方便后续的处理。 2. 对解析出的语法树进行语义分析,例如检查表和列的存在性、类型匹配等。 3. 对语法树进行优化处理,例如消除冗余的列、优化查询计划等。 4. 生成Hive执行计划,用于执行Hive SQL语句。 总之,Hive SQL语法树解析工具是一个十分重要的工具,它能够将Hive SQL语句转换成易于处理的语法树形式,方便进行语义分析和优化处理。这对于Hive的查询和数据处理非常有帮助。 ### 回答2: Hive SQL语法树解析工具是一种用于解析Hive SQL语句,并将其转换为语法树结构的工具。它可以帮助开发人员分析和理解Hive SQL语句的结构和含义。 Hive SQL语法树解析工具的工作原理是先对输入的Hive SQL语句进行词法分析,将其分解为一个个的词法单元,比如关键字、标识符、运算符等。然后,根据语法规则,将词法单元组合成语法单元,逐步构建语法树。 语法树是一种树状结构,它以SQL语句的语法规则为基础,将SQL语句以层次化的方式表示出来。每个节点代表一个语法单元,比如SELECT、FROM、WHERE等。节点之间通过父子关系连接起来,形成一棵树。 语法树的解析过程包括词法分析、语法分析和语义分析三个阶段。在词法分析阶段,工具会将输入的SQL语句拆分成一个个的词法单元。在语法分析阶段,工具会根据语法规则,将词法单元组合成语法单元,逐步构建语法树。在语义分析阶段,工具会进一步验证语法树的正确性,并进行语义解析,比如检查表和列的存在性、类型一致性等。 使用Hive SQL语法树解析工具可以帮助开发人员更好地理解和调试Hive SQL语句。通过查看语法树结构,可以清晰地了解SQL语句的组成部分和执行顺序。此外,语法树解析工具还可以用于编写自定义的Hive查询优化器和执行引擎,提高查询性能和效率。 总而言之,Hive SQL语法树解析工具是一种强大的工具,能够将Hive SQL语句解析为语法树结构,帮助开发人员分析和优化SQL查询语句。它在Hive生态系统中有着重要的作用。 ### 回答3: Hive SQL语法树解析工具是一种用于解析Hive SQL语句的工具。在Hive中,SQL语句被解析为一个语法树,然后通过语法树进行语义分析和执行计划生成。 Hive SQL语法树解析工具主要包括以下几个方面的功能: 1. 词法分析:将输入的SQL语句拆分成一个个的词法单元,如关键字、标识符、运算符等。 2. 语法分析:基于词法分析结果,将词法单元组织成语法规则所定义的语法结构,生成语法树。 3. 语义分析:对语法树进行语义检查,包括检查列或表是否存在、检查数据类型是否匹配等,确保SQL语句的合法性。 4. 执行计划生成:根据语法树和语义分析的结果,生成Hive SQL语句对应的执行计划,用于后续的查询执行。 Hive SQL语法树解析工具的作用是将用户输入的SQL语句转换为可执行的查询计划,为Hive查询引擎提供执行指令。它在Hive的查询过程中起到关键作用,有效地提高查询效率和查询执行的准确性。 总而言之,Hive SQL语法树解析工具是一种用于解析Hive SQL语句的工具,通过词法分析、语法分析、语义分析和执行计划生成等功能,将输入的SQL语句转换为可执行的查询计划。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值