hive语法和常用函数_第1页
hive语法和常用函数_第2页
hive语法和常用函数_第3页
hive语法和常用函数_第4页
hive语法和常用函数_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Hive就是一个基于Hadoop分布式系统上得数据仓库,最早就是由Facebook公司开发得,Hive极大

得推进了Hadoopecosystem在数据仓库方面上得发展。

Facebook得分析人员中很多工程师比较擅长而SQL而不善于开发MapReduce程序,

为此开发出Hive,并对比较熟悉SQL得工程师提供了一套新得SQLIike方言---HiveQL»

HiveSQL方言特别与MySQL方言很像,并提供了HiveQL得编程接口。HiveQL语

句最终被Hive解析器引擎解析为MarReduce程序,作为job提交给JobTracker运行。这对

MapReduce框架就是一个很有力得支持。

Hive就是一个数据仓库,它提供了数据仓库得部分功能:数据ETL(抽取、转换、

加载)工具,数据存储管理,大数据集得查询与分析能力。

由于Hive就是Hadoop上得数据仓库,因此Hive也具有高延迟、批处理得得特性,

即使处理很小得数据也会有比较高得延迟。故此,Hive得性能就与居于传统数据库得数据仓库得

性能不能比较了。

Hive不提供数据排序与查询得cache功能,不提供索引功能,不提供在线事物,也

不提供实时得查询功能,更不提供实时得记录更性得功能,但就是,Hive能很好地处理在不变得超

大数据集上得批量得分析处理功能。Hive就是基于hadoop平台得,故有很好得扩展性(可以自适应

机器与数据量得动态变化),高延展性(自定义函数),良好得容错性,低约束得数据输入格式。

下面我们来瞧一下Hive得架构与执行流程以及编译流程:

,将HiveQL语

‘句编译成;

1_并优化乏厂’

♦(编译器,优化器、■期蝴.则力

执行器等)

1

1

/IRD=MS]-

Metastore

行薮据)WMIH

Hive的体系结构和执行流程

Parser]将Hi—头投募

将逻辑计划转成物理MgpBg蓟£g.Job计划

♦■,♦■■■■■■[提交给Hadoop♦台运行MapReduceJob作业:■学

Hive引擎执行编译优化HiveQL语句和提交执行的过程

用户提交得HiveQL语句最终被编译为MapReduce程序作为Job提交给Hadoop执

行。

Hive得数据类型

Hive得基本数据类型

有:TINYINT,SAMLLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,STRING,TlMESTAMP(VO、8、0+)与

BINARY(VO、8、0+).

Hive得集合类型有:STRUCT,MAP与ARRAY。

Hive主要有四种数据模型(即表):(内部)表、外部表、分区表与桶表。

表得元数据保存传统得数据库得表中,当前hive只支持Derby与MySQL数据库。

内部表:

Hive中得表与传统数据库中得表在概念上就是类似得,Hive得每个表都有自己

得存储目录,除了外部表外,所有得表数据都存放在配置在hivesite、xml文件得${hive、

metastore、warehouse、dir}/table_name目录下。

Java代码

1.CREATETABLEIFNOTEXISTSstudents(user_noINT,nameSTRING.sexSTRING,

2.gradeSTRINGMOT,班级')MONT,学生表,

3.ROWFORMATDELIMITED

4.FIELDSTERMINATEDBY

5.STOREASTEXTFILE;

外部表:

外部表指向已经存在在HadoopHDFS上得数据,除了在删除外部表时只删除元数

据而不会删除表数据外,其她与内部表很像。

Java代码

1.CREATEEXTERNALTABLEIFNOTEXISTSstudents(user_noINT,nameSTRING,sexSTRING,

2.classSTRINGMOT,班级')MONT'学生表’

3.ROWFORMATDELIMITED

4.FIELDSTERMINATEDBY

5.STOREASSEQUENCEFILE

6.LOCATION'/usr/test/data/studentsvtxt,;

分区表:

分区表得每一个分区都对应数据库中相应分区列得一个索弓I,但就是其组织方

式与传统得关系型数据库不同。在Hive中,分区表得每一个分区都对应表下得一个目录,所有得分

区得数据都存储在对应得目录中。

比如说,分区表partitinTable有包含nation(国家)、ds(日期)与city(城市)3

个分区,其中nation=china,ds=20130506,city=Shanghai则对应HDFS上得目录为:

/datawarehouse/partitinTable/nation=china/city=Shangha

i/ds=20130506/。

Java代码

I.CREATETABLEIFNOTEXISTSstudents(user_noINT,nameSTRING.sexSTRING,

2.classSTRINGMOT,班级’)MONT,学生表,

3.PARTITIONEDBY(dsSTRING.countrySTRING)

4.ROWFORMATDELIMITED

5.FIELDSTERMINATEDBY

6.STOREASSEQUENCEFILE;

分区中定义得变量名不能与表中得列相同。

桶区表:

桶表就就是对指定列进行哈希(hash)计算,然后会根据hash值进行切分数据,将

具有不同hash值得数据写到每个桶对应得文件中。

Java代码

1.CREATETABLEIFNOTEXISTSstudents(user_noINT,nameSTRING,sexSTRING.

classSTRINGMOT,班级',scoreSMALLINTMOT,总分')MONT,学生表'

3.PARTITIONEDBY(dsSTRING,countrySTRING)

4.CLUSTEREDBY(user_no)SORTEDBY(score)INTO32BUCKETS

5.ROWFORMATDELIMITED

6.FIELDSTERMINATEDBY

7.STOREASSEQUENCEFILE:

内部表与外部表得主要区别:

1)、内部表创建要2步:表创建与数据加载,这两个过程可以同步执行。在数据加

载得过程中,数据数据会移动到数据仓库得目录中;外部表得创建只需要一个步骤,表创建数据加

载同时完成,表数据不会移动。

2)、删除内部表时,会将表数据与表得元数据一同删除;而删除外部表时,紧删除

表得元数据而不会删除表数据。

在上一节《深入学习《ProgramingHive》:Hive得数据模型(表)》中,已经学习过表得定义,接下

来接着学习Hive得DDL操作。

复制表结构:

Java代码

1.CREATETABLEIFNOTEXISTSstudents?LIKEstudents;

查瞧表结构:

Java代码

I.DESCRIBETABLEstudents;

删除表:

Java代码

I.DROPTABLEstudents;

创建视图:

Hive中得视图(view)得概念与传统数据库中得表就是相同得,就是只读得,目

前还不支持不支持物化视图。

如果在创建试图后,再将基本表中被视图引用得列修改,那么修改后得数据列

将不会体现在视图中;如果基本表被删除或以不兼容得方式被修改,则查询该视图时会失

败。

Java代码

I.CREATEVIEWIFNOTEXISTSview_students(user_no,name,score)

2.AS

3.SELECTuser_no,name,scoreFROMstudents;

删除视图:

Java代码

1.DROPVIEWview_students;

定制表存储方式:

Java代码

1.CREATETABLEIFNOTEXISTSemployees(

2.noSTRING.

3.nameSTRING,

4.salaryFLOAT,

5.subordinatesARRAY<STRING>,

6.deductionsMAP<STRING,FLOAT>.

addressSTRUCKstreet:STRING.district:STRING.city:STRING.province:STRING,ZIP:STRING>

8.)

9.ROWFORMATDELIMITED

10.FIELDSTERMINATEDBY'\001'

11.COLLECTINITEMSTERMINATEDBY'\002'

12.MAPKEYSTERMINATED'\003'

13.LINESTERMINATEDBY'\n'

14.STOREDAS

15.INPUTFORMAT'orgxIinkedin^haiwreovAvroContainerInputFormat'

16.OUTPUTFORMAT'orgxIinkedin^haivvreoxAvroContainerOutputFormat,;

修改表结构:

1)、重命名表

Java代码

I.ALTERTABLEtabIe_nameRENAMETOnew_tabIe_name;

只修改了表名,不会改变表结构与数据存放得位置。

2)、修改列名、类型、位置及注释

Java代码

I.CREATETABLEIFNOTEXISTStest(aINT,bSTRING,cFLOAT);〃创建测试表

2.〃修改列名

3.TABLEtestCHANGEaa2INT;

4./*将a列得名字改为a2,并将其数据类型改为STRING,然后将之放在b列之后;修改

5.*后得表结构为:bINT,a2STRING,cFLOAT

6.*/

7.ALTERTABLEtestCHANGEaa2STRINGAFTERb;

8./*

9.*将b列得名字改为b2,并将其数据类型由FLOAT改为DOUBLE,然后将之

10.*放在第一列;修改后得表结构为:

11.*b2DOUBLE,aSTRING,cFLOAT

12.*/

13.ALTERTABLEtestCHANGEbb2DOUBLEFIRST;

列得改变只会修改Hive得元数据,而不改变实际得数据。

用户应该确保元数据得定义与实际得数据结构保持一致。

3)、增加新列

Java代码

i.ALTERTABLEtestADDCOLOMNS(dINT,eSTRING);

4)、改变表得数据存储格式

Java代码

1.ALTERTABLEtestSETSEQUENCEFILE;

5)、添加分区Partition

Java代码

1.ALTERTABLEstudentsADDPARTITION(ds='20130507',country='china')

2.LOCATION'/usr/test/data/test%txt':

6)、删除分区Partition

Java代码

1.ALTERTABLEstudentsDROPPARTITION(ds='20130507',country='china');

7)、创建函数

Java代码

I.CREATETEMPORARYFIUNCTIONaFuncasclass_name;

8)、删除函数

Java代码

I.DROPTEMPORARYFlUNCTIONaFunc;

9)、显不表

Java代码

1.SHOWTABLESstudents;

9)、显示分区

Java代码

1.SHOWPARTITIONSstudents;

本节继续讨论HiveQL,Hive查询语言,如何向Hive表中添加数据,操纵数据与从表中将数据提取到

文件系统。

之前已经学习过Hive表得创建,本节主要关注向表中填充数据,使表中有数据可

供查询。

先行创建本节要使用得表empIoyees:

Java代码

1.CREATETABLEempIoyees(

2.nameSTRING.

3.salaryFLOAT,

4.subordinatesARRAY<STRING>MENT'下属

5.deductionsMAP<STRING,FLOAT>MENT'扣费

addressSTRUKstreet:STRING,city:STRING,state:STRING,zip:INT>

7.)

8.PARTITIONEDBY(countrySTRING.stateSTRING);

向管理表(非外部表)中加载数据

由于Hive没有行级得insert,update与deIete操纵,向表中加载数据得唯一方法

就就是“批量”加载数据。如下示例,想一个分区表中加载一批数据:

Java代码

1.LOADDATALOCALINPATH'${env:HOME}/caIaforniaempIoyees'

2.OVERWRITEINTOTABLEemployees

3.PARTITION(country="US',state='CA');

在加载数据之前首先要要保证已经创建有符合条件得分区。在这个示例中,数据

被加载后再Hive中得目录为:

hdfs://master_server/user/hive/warehouse/mydb、

db/empIoyees/country=US/state=CA

这个示例需要注意几点:

关键字OVERWRITE:加上该词说明如果之前已经箱盖分区中加载过数据得话,

则之前得数据会首先被“清洗掉”,然后才加载新数据;如果没有加关键字OVERWRITE得话,如:

Java代码

I.LOADDATALOCALINPATH'${env:HOME}/caIaforniaempIoyees'

2.INTOTABLEempIoyees

3.PARTITION(country='US',state='CA');

就不会将已有得数据清洗,而就是直接在原有数据后边追加新得数据。

关键字LOCAL:表明就是从本地文件系统得文件夹中加载数据,如果不加LOCAL

关键字,则表明就是从HDFS系统得文件夹中加载数据:

Java代码

1.LOADDATAINPATH'${env:HOME}/caIaforniaempIoyees'

2.INTOTABLEemployees

3.PARTITION(country='US',state='CA');

另外一点就就是,对于要指定要加载得文件得路径,指定一个文件夹就是比较符

合常规得,这要比每次单独指定文件夹中得一个具体得文件要好,这样Hive会一次把指定文件夹

下得所有得位安全都拷贝到Hive仓库中。

Hive在加载数据时并不会管要加载得数据就是否与表定义模式相匹配,但就是

会验证文件格式,比如说,在表中第一得保存得数据文件为SEQUENCEFILE,那么加载后得文件就必

须为SEQUENCEFILE文件。

通过HiveQL查询语句添加数据

INSERT语句可以让用户通过一个HiveQLQuery语句向Hive表中插入数据。瞧下

面得一个示例(这里假设已经定义过表staged_empIoyees):

Java代码

1.INSERTOVERWRITETABLEemployess

2.PARTTITION(country='US',state='OR')

3.SELECT*FROMstaged_empIoyeesse

4.WHEREsety='US'ANDse、st='OR';

OVERWRITE关键字,我们已经讨论过。但对于本示例来说,如果去掉OVERWRITE

或用INTO替换掉,如:

Java代码

I.INSERTINTOTABLEemployess

2.PART!ITION(country='US',state='OR')

3.SELECT*FROMstaged_empIoyeesse

4.WHEREsety='US'ANDse、st='OR';

那么Hive就会将数据以“追加”得方式插入数据到employess表。

这个示例在一个场景中特别有用:数据已经被保存在另外一个表中,如Hive得外

部表,然后用户想把某些数据做最终得保存到分区表中;或者从原有得数据源表中将数据保存成

符合用得要求得不同得数据记录得格式。

然而,如果staged_employees中数据特别大,有可能您需要执行很多次这样得插

入查询导入数据得话,比如说美国部分得数据就要执行65次之多。Hive提供了另外一种INSERT语

法,就是您只扫描一次表就可以将数据插入到对应得分区中:

Java代码

1.ROMstaged_empIoyeesse

2.INSERTINTOTABLEemployess

3.PARTTITION(country='US',state='OR')

4.SELECT*WHEREsety='US'ANDse、st='OR';

5.INSERTINTOTABLEemployess

6.PARTTITION(country='US',state='CA')

7.SELECT*WHEREsety='US'ANDse、st='CA';

8.INSERTINTOTABLEemployess

9.PARTTITION(country='US',state='IL')

1().SELECT*WHEREsety='US'ANDse、st='IL';

11.、、、

这种INSERT语法也可以一次插入多个表。

动态分区添加数据

就上例来说,好友一个问题,那就就是如果有特别多得分区要创建得话,用户不

得不要写许多HiveQL语句!幸运得就是,Hive提供一个叫动态分区得功能,可以基于用户得查询参

数推断要创建得分区。通过与动态分区相比较,之前我们讨论得分区插入数据被称为静态分区数

据导入。

将上面得静态分区作如下修改,就变成动态分区数据导入得示例:

Java代码

1.INSERTOVERWRITETABLEemployees

2.PARTITION(country,state)

3.SELECT、、、,sety,se、st

4.FROMstaged_empIoyeesse

对于本例来说,Hive会通过SELECT语句中最后两列sety与se、st得值来决定

employees表中得分区得key,contry与state°Hive在动态分区插入操作中特别强调源表得数据列

得值与要插入分区得key得值得位置关系,而不就是通过名字匹配,这也就是为什么在

staged_employees表中给国家与州定义不同得名字得原因。

假设staged_employees有100个国家与州得匹配对儿,那么执行玩这个HiveQL语

句后,employees就会有100个国家分区!

用户也可以混合使用动态分区与静态分区数据插入,如下例中,我们就是用了一

个静态得country(US)与动态得州得值:

Java代码

1.INSERTOVERWRITETABLEemployees

2.PARTITION(country='US',state)

3.SELECT、、、,sety,se、st

4.FROMstaged_employeesse

5.WHEREsety='US';

要注意得就是,必须要把静态分区得key放在动态分区得key之前。

默认请情况下,动态分区插入得功能就是被禁用得,当被激活后,Hive默认会工

作在“严格(strict)”模式下。在“严格(strict)”模式下,必须使用静态分区与动态分区混合

使用得方式,这主要就是避免一些不好得数据查询设计。

要使用动态模式,用户首先要激活动态分区得一些参数设置:

Java代码

hive>sethibe、exec、dynamic、partition=true;

2hive>sethibe、exec、dynamicvmode=nonstrict;

3hive>sethibe、exec、max、dynamicspartitionsxpernode=1000;

4

5hive>INSERTOVERWRITETABLEemployeesPARTITION(country,state)

6>SELECT、、、,sety,se、stFROMstaged_employeesse;

nonstrict可以完全由用户得查询参数来动态创建所有得分区。

在一个HiveQL中创建表与加载数据

在Hive中,用户可以完全使用一条语句创建表并同时加载数据:

Java代码

I.CREATETABLEca_employees

2.ASSELECTnamesalary,address

3.FROMemployees

4.WHEREstate='CA';

这种方法特别适用于在一个大表中提取一个子数据集得场景,这种功能不适合

外部表,因外外部表就是在定义时直接给其制定一个数据文件得路径。

导出数据

之前讲得都就是如何将数据加载到Hive表中,那么如何将表中数据导出表呢?

用户可以使用INSERT、、、DIRECTORY、、、语句导出数据,示例如下:

Java代码

I.INSERTOVERWRITELOCALDIRECTORY'tmp/ca_empIoyees'

2.SELECTname,salary,address

3.FROMemployees

4.WHEREstate='CA';

其中OVERWRITE与LOCAL得意义同上。

与加载数据一样,用户同样可以在一个语句中将数据导出到多个文件夹:

Java代码

I.FROMstaged_empIoyeesse

2.INSERTOVERWRITEDIRECTORY'/tmp/or_employees'

3.SELECT*FROMsety='US'ANDse、st='OR'

4.INSERTOVERWRITEDIRECTORY'/tmp/CA_empIoyees'

5.SELECT*FROMsety='US'ANDse、st='CA'

6.INSERTOVERWRITEDIRECTORY'/tmp/lL.employees'

7.SELECT*FROMsety='US'ANDse、st='IL'

前几章已经学习过Hive表得定义与数据操纵,本章我们开始学习HiveQL查询。

SELECT、、、FROM、、、查询

SELECT在SQL中就是一个投影操作。让我们从新来瞧之前定义过得分区表

employees:

Java代码

I.CREATETABLEemployees(

2.nameSTRING.

3.salaryFLOAT,

4.subordinatesARRAY<STRING>MENT'下属’,

5.deductionsMAP<STRING,FLOAT>MENT'扣费

6.addressSTRUKstreet:STRING,city:STRING,state:STRING,zip:INT>

7.)

8.PARTITIONEDBY(countrySTRING.stateSTRING):

SELECT查询:

Java代码

1.hive>SELECTname,salaryFROMemployees;

2.JohnDoe100000,、0

3.MarySmith80000x0

4.ToddJones70000x0

5.Bi11King60000,、0

用户也可以给FROM之后得表,视图或子查询起一个别名,如:

Java代码

1.hive>SELECTe、name,e%salaryFROMemployeese:

上面两个HiveQL语句就是相同得,给表起别名在JOIN操作中特别有用。

下面我们来瞧如何查询empIoyees表中得集合类型得数据。我们先瞧一下如何查

询ARRAY类型得数据,如empIoyees表得下属“subordinates”

Java代码

1.hive>SELECTname,subordinatesFROMemployees;

2.JohnDoe["MarySmith","ToddJones"]

3.MarySmith["BillKing'1]

4.ToddJones[]

5.Billking[]

再瞧MAP类型得查询,如“deductions”:

Java代码

hive>SELECTname,deductionsFROMempIoyees;

2.JohnDoe{"FederaITaxes":0x2,"StateTaxes":0x05,"Insurance":0x1)

3.MarySmith{"Federa1Taxes":0>2,"StateTaxes":0、05,"Insurance":0%1)

4.ToddJones{"FederalTaxes":0、15,"StateTaxes":0、03,"Insurance":051)

5.Bi11King{"Federa1Taxes":01.15,"StateTaxes":Ox03,"Insurance":0x1}

再瞧STRUCT类型得查询,如“address”:

Java代码

I.hive>SELECTname,addressFROMempIoyees;

2.JohnDoe{"Street":"1MichignAvex","city":"Chicago","State"IL","ZIP":60600)

3.MarySmith{"Street":"100OntarioStt","city":"Chicago","State":nIL","ZIP":60601)

H

4.ToddJones{"Street":"200ChicagoAvex","city":"OakPark","State":IL","ZIP":60700)

5.BiIIKing{"Street":"300ObscureDrxM,ncity":"0bscuria","State"IL","ZIP":60100}

接下来我们再瞧如何查瞧集合性属性字段中得数据:

Java代码

1.hive>SELECTname,subordinates[0],deductions["StateTaxes"],address、

cityFROMemployees;

2.JohnDoeMarySmithOx05Chicago

3.MarySmithBi11KingOx05Chicago

4.ToddJonesNULL0\03OakPark

5.Bi11KingNULLOx03Obscuria

使用正则表达式查询符合条件得列

在Hive查询中,用户可以使用正则表达式查询符合条件得列,下面得实例中就就

是使用正则表达式得使用用例,可以查询到symbol列与所有以“price”开头得列:

Java代码

1.hive>SELECTsymbol,'prices*'FROMstocks;

2.AAPL195、69197、88194、0194、12194、12

3.AAPL192、63196、0190、85195、46195、46

4.AAPL196、73198、37191、57192、05192、05

5.AAPL195、17200、2194、42199、23199、23

6.AAPL195、91196、32193>38195、86195、86

7.、、、

列计算

在HiveQL中,用户不但可以从表中查询某些列,还可以通过函数或数学表达式来

计算列得值。例如,我们可以在employees表中查询雇员得姓名,薪水,联邦税百分百及其她列得

值:

Java代码

1.hive>SELECTupper(name),salary,deductions[nFederaITaxes"],

2.>round(salary*(1deductions["FederaITaxes"]))

3.>FROMemployees;

4.JOHNDOE100000x00、280000

5.MARYSMITH80000x00、264000

6.TODDJONES70000v0Ox1559500

7.BILLKING60000v00、1551000

Hive就是使用JAVA写得开源软件,在函数或数学表达式来计算列得值时类型转

型与JAVA得转型相同。

聚合函数

要在HiveQL查询中使用聚合函数,必须先将hive、map、aggr■配置参数设置为

true,举例如下:

Java代码

1.hive>SEThive、map、aggr=true;

2.hibe>SELECTcount(*),avg(saIary)FROMemployees;

但就是将

Java代码

I.hive、map、aggr

设置为true会占用更多得内存。

LIMIT

一次典型得HiveQL查询可能会返回所有符合条件得数据记录,但就是LIMIT关键

字可以限制返回得记录得条数:

Java代码

hive>SELECTupper(name),salary,deductions["FederalTaxes"],

2.>round(salary*(1deductions["FederaITaxes"]))

3.>FROMempIoyees

4.>LIMIT2;

5.JOHNDOE100000x00、280000

6.MARYSMITH80000>00、264000

给列奇别名

Java代码

I.hive>SELECTupper(name),saIary,deductions["FederaITaxes"]AS

2>fed_taxes,round(salary*(1deductions["FederaITaxes"]))AS

3>saIary_minus_fed_taxes

4>FROMempIoyees

5>LIMIT2;

6.JOHNDOE100000x00、280000

7.MARYSMITH80000、00、264000

子查询

给列起别名特别适合与子查询中得列,让我们将上个查询示例修改为子查询得

使用用例:

Java代码

1.hive>FROM(

2>SELECTupper(name).salary,deductions["FederaITaxes"]AS

3>fed_taxes,round(salary*(1deductions["FederaITaxes"]))

4>ASsaIary_minus_fed_taxes

5>FROMemployees

6>)e

>SELECTe、name,exsaIary_minus_fed_taxes

>WHEREe、saIary_minus_fed_taxes>70000;

9.JOHNDOE100000s00、280000

CASE、、、WHEN、、、THEN语句

CASE、、、WHEN、、、THEN向标准得SQL语句中一样使用在SELECT列中,对某一

个列得返回值做判断,示例如下:

Java代码

I.hive>SELECTname,salary,

2.>CASE

3.>WHENsalary<50000、0THEN1low'

4.>WHENsalary>=50000、0ANDsalary<70000x0THEN'middl

5.>WHENsalary>=70000、0ANDsalay<100000、0THEN'high'

6.ELSE'veryhigh'

7.>ENDASbracketFROMemployees;

8.JohnDoe100000x0veryhigh

9.MarySmith80000x0high

10.ToddJones70000x0high

11.BillKing60000、0middle

12.BossMan200000K0veryhigh

13.FredFinance150000%0veryhigh

14.StcyAccountant60000、0middle

WHERE过滤条件

SELECT决定返回哪些数据列,而WHERE决定返回那些符合条件得数据:

Java代码

I.hive>SELECTname,salary,deductions["FederalTaxes"],

2>salary*(1deductions["FederaITaxes"])

3>FROMempIoyees

4>WHEREround(salary*(1deductions["FederaITaxes"]))>

5>70000;

6.ohnDoe100000x00、280000、0

该示例有一个问题,那就就是salary*(1deductions["FederaITaxes"])分

别在SELECT部分与WHERE部分都执行了,性能上不就是多优化。那么,对salary*(1

deductions["FederalTaxes”])使用别名能否消除这种冲突呢?,不幸得就是这就是无效得:

Java代码

hive>SELECTname,salary,deductions["FederaITaxes"],

2>salary*(1deductions["FederaITaxes"])AS

3>saIary_minus_fed_taxes

4>FROMemployees

5>WHEREround(saIary_minus_fed_taxes)>70000;

6.FAILED:Errorinsemanticanalysis:Line4:13Invalidtablealiasor

coIomnreferencesaIary_minus_fed_taxes':(possiblecoIomnnames

8.are:name,salary,subordinates,deductions,address)

如错误信息中所说,用户不能在WHERE部分中引用列得别名,那么我们就是否可

以使用其她办法来消除这种冲突呢?答案就是使用子查询:

Java代码

i.hive>SELECTe、*FROM

2>(SELECTname,salary,deductions["FederaITaxes"]ASded.

3>salary*(1deductions["FederaITaxes"])AS

4>saIary_minus_fed_taxes

5>FROMempIoyees)e

6>WHEREround(saIary_minus_fed_taxes)>70000;

浮点比较陷阱

在WHERE查询条件中:在比较不同类型得数值(如FLOATvsDOUBLE)时,会引发浮

点比较陷阱。

瞧下面得HiveQL语句,本来只想要查询FederalTaxes>0、2,但就是返回结果

如下:

Java代码

I.hive>SELECTname,saIary,deductions['FederaITaxes']

>FROMempIoyeesWHEREdeductions['FederaITaxes']>0、2;

3.JohnDoe100000x00、2

4.MarySmith80000x00、2

5.BossMan200000v00、3

6.FredFinance150000s0(0、3

我们发现,为什不符合过滤条件(deductions('FederaITaxes')二二0、2)得结

果也返回了?!这就就是浮点比较陷阱引发得。

那么如何来避免这个陷阱呢?那就要将0、2强制转型了:

Java代码

1.hive>SELECTname,salary,deductions['FederalTaxes']

2.>FROMemployees

3.>WHEREdeductions['FederaITaxes']>cast(0v2ASFLOAT);

4.BossMan200000v0Ox3

5.FredFinance150000x00、3

LIKE与RLIKE

LIKE标识模糊查询:

Java代码

1.hive>SELECTname,address^streetFROMempIoyeesWHEREaddress、streetLIKE'%Avex;

2.JohnDoe1MichiganAve、

3.ToddHones200ChicagoAve、

4.

5.hive>SELECTname,addressstreetFROMemployeesWHEREaddress

streetLIKE'%Chi%';

6.ToddHones200ChicagoAve、

RLIKE就是使用正则表达式:

Java代码

1.hive>SELECTname,addressvstreetFROMemployees

2.>WHEREaddress^streetRLIKE\*(Chicago|Ontario)x*,:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论