当前位置: 首页 > 科技观察

HiveSQL常用命令汇总,大数据开发者按需收集

时间:2023-03-13 01:38:53 科技观察

Hive是基于Hadoop生态的重要组件,是数据仓库中管理和分析数据的工具。她提供了SQL查询方法来分析存储在HDFS分布式文件系统中的数据,可以将结构化的数据文件映射成数据库表,并提供完整的SQL查询功能。这种SQL就是HiveSQL,可以将SQL语句转换成MapReduce任务运行,并使用专门的SQL查询分析需要的内容,让不熟悉mapreduce的用户也可以方便的使用SQL语言进行查询,总结、分析数据。一、基本命令1、数据库操作showdatabases;#查看一个数据库usedatabase;#输入一个数据库showtables;#显示所有表desc表名;#显示表结构showpartitions表名;#显示表名partitionshowcreatetable_name;#显示创建表2的结构,修改表结构usexxdb;创建表xxx;#internaltablecreatetablexxxlikexxx;#创建一个和别人一样结构的表usexxdb;创建外部表xxx;#外部表使用xxdb;创建外部表xxx(lint)partitonedby(dstring);#分区表altertabletable_namesetTBLPROPROTIES('EXTERNAL'='TRUE');#内表转外部表altertabletable_namesetTBLPROPROTIES('EXTERNAL'='FALSE');#外部表转内表3.字段类型基本类型:tinyint,smallint,int,bigint,float,decimal,boolean,stringCompositetypes:struct,array,map2.常用函数length()#返回字符串长度trim()#去掉两边的空格lower(),upper()#大小写转换reverse()#反转字符串cast(exprastype)#类型转换substring(stringA,intstart,intlen)#字符串截取split(stringstr,stringpat)#根据pat字符串拆分str,返回拆分后的字符串数组coalesce(v1,v2,v3,...)#返回列表中的第一个非空元素,如果所有值都为空,则返回nullfrom_unixtime(unix_timestamp(),'yyyy-MM-ddHH:mm:ss')#返回当前时间instr(stringstr,stringsearch_str)#返回第二个参数在要查找的字符串中的位置(如果没有找到)return0)concat(stringA,stringB,stringC,...)#字符串拼接concat_ws(stringsep,stringA,stringB,stringC,...)#自定义分隔符的字符串拼接sepstr_to_map(stringA,stringitem_pat,stringdict_pat)#将字符串转换为mapmap_keys(mapm)#提取map的key,返回key的数组datediff(date1,date2)#日期比较函数,返回相差天数,datediff('${cur_date},d)explode(colname)#explode是将hiveline中的复杂数组或map结构拆分成多行三、相关概念1、hivehive是一个基于hadoop的数据仓库工具,可以结构化数据文件映射为数据库表,提供类SQL查询功能2、基本用户界面:CLI、shell命令行;JDBC/ODBC是hive的java实现;webGUI是通过浏览器访问hive;元数据存储:通常存储在mysql、derby等关系型数据库中;hive元数据包括表的名称、表的列和分区及其属性、表的属性(是否为外部表)、表的数据所在目录等。解释器,编译器、优化器从词法分析、语法分析、编译、优化、查询计划生成等环节完成HQL查询语句。生成的查询存储在HDFS中,随后通过mapreduce调用执行。因此,Hive和Hadoop的关系可以理解为用户发出SQL查询语句,Hive将查询存储在HDFS中,然后通过mapreduce调用执行。3、tableHive中的Table在概念上类似于数据库中的Table。每个Table在Hive中都有一个对应的目录来存放数据。比如一张表pvs,它在HDFS中的路径是:/wh/pvs,其中wh是hive-site.xml中${hive.metastore.warehouse.dir}指定的数据仓库的目录,所有表数据(不包括外部表)都存储在这个目录中。4.partitionPartition对应数据库中Partition列的密集索引,但是Partition在Hive中的组织方式与数据库中有很大的不同。在Hive中,表中的一个Partition对应表下的一个目录,所有的Partition数据都存放在对应的目录下。5.bucketsBuckets为指定列计算hash,根据hash值拆分数据。目的是为了并行,每个Bucket对应一个文件。将user列分布到32个桶中,先为user列的值计算hash,hash值为0对应的HDFS目录为:/wh/pvs/ds=20090801/ctry=US/part-00000;hash值为20的HDFS目录为:/wh/pvs/ds=20090801/ctry=US/part-000206,externaltableExternalTable指向HDFS中已经存在的数据,创建Partition即可。它在元数据的组织上与表相同,但实际数据的存储方式却大不相同。建表过程和数据加载过程(这两个过程可以在同一条语句中完成),在加载数据的过程中,会将实际数据移动到数据仓库目录中;之后,数据对的访问将直接在数据仓库目录中完成。删除表时,表中的数据和元数据会同时删除。ExternalTable只有一个进程。加载数据和创建表同时完成(CREATEEXTERNALTABLE...LOCATION)。实际数据存放在LOCATION后指定的HDFS路径下,不会移动到数据仓库目录下。删除ExternalTable时,只会删除元数据,不会删除表中的数据。7、查看全量数据和增量数据的分区信息:如果一个分区的大小随着时间的推移而增加,那么最新的分区就是全量数据。如果分区的大小随时间增加或减少,则每个分区都是增量数据。四、HQL与SQL的异同1.HQL与SQL往往是不同的。selectdistinct之后,必须指定字段名。join条件只支持等价关联,不支持or条件子查询,不能用在select中;HQL中没有UNION,可以用distinct+unionall实现UNION;HQL用分号隔开,每条语句的最后都要写分号;HQL中字符串的比较是严格的,区分大小写和空格,所以比较时建议使用upper(trim(a))=upper(trim(b))进行日期判断,建议使用to_date(),如:to_date(orderdate)='2016-07-18'关键字必须在字段名前加上``符号,如select`exchange`fromxxdb。xxt;数据库和表/视图之间只有1个点,比如xx_db.xx_tb。2、HQL不支持update,变相使用unionall+leftjoin(isnull)实现update。取出增量数据;使用昨天分区的全量数据通过主键左连接增量数据,增量表只取主键为空的数据(即取全量没有变化的数据);合并1和2的数据覆盖到最新的分区,实现update。3、HQL不支持delete,变相使用notexists/leftjoin(isnull)方法实现。取出删除的主键数据(表B);使用上一个分区(A表)的全量数据通过主键leftjoinA,只取主键为空的A中的数据,然后直接insertoverwrite到新分区。对于懂SQL的人来说,迁移到HiveSQL还是比较容易的。大部分语法都弄清楚了,有几个功能不一致。