hive语法和常用函数[学练结合]

上传人:8** 文档编号:190952216 上传时间:2023-03-01 格式:DOC 页数:63 大小:1.17MB
返回 下载 相关 举报
hive语法和常用函数[学练结合]_第1页
第1页 / 共63页
hive语法和常用函数[学练结合]_第2页
第2页 / 共63页
hive语法和常用函数[学练结合]_第3页
第3页 / 共63页
点击查看更多>>
资源描述
Hive是一个基于Hadoop分布式系统上的数据仓库,最早是由Facebook公司开发的,Hive极大的推进了Hadoop ecosystem在数据仓库方面上的发展。 Facebook的分析人员中很多工程师比较擅长而SQL而不善于开发MapReduce程序,为此开发出Hive,并对比较熟悉SQL的工程师提供了一套新的SQL-like方言Hive QL。 Hive SQL方言特别和MySQL方言很像,并提供了Hive QL的编程接口。Hive QL语句最终被Hive解析器引擎解析为MarReduce程序,作为job提交给Job Tracker运行。这对MapReduce框架是一个很有力的支持。 Hive是一个数据仓库,它提供了数据仓库的部分功能:数据ETL(抽取、转换、加载)工具,数据存储管理,大数据集的查询和分析能力。 由于Hive是Hadoop上的数据仓库,因此Hive也具有高延迟、批处理的的特性,即使处理很小的数据也会有比较高的延迟。故此,Hive的性能就和居于传统数据库的数据仓库的性能不能比较了。 Hive不提供数据排序和查询的cache功能,不提供索引功能,不提供在线事物,也不提供实时的查询功能,更不提供实时的记录更性的功能,但是,Hive能很好地处理在不变的超大数据集上的批量的分析处理功能。Hive是基于hadoop平台的,故有很好的扩展性(可以自适应机器和数据量的动态变化),高延展性(自定义函数),良好的容错性,低约束的数据输入格式。 下面我们来看一下Hive的架构和执行流程以及编译流程: 用户提交的Hive QL语句最终被编译为MapReduce程序作为Job提交给Hadoop执行。Hive的数据类型 Hive的基本数据类型有:TINYINT,SAMLLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,STRING,TIMESTAMP(V0.8.0+)和BINARY(V0.8.0+)。 Hive的集合类型有:STRUCT,MAP和ARRAY。 Hive主要有四种数据模型(即表):(内部)表、外部表、分区表和桶表。 表的元数据保存传统的数据库的表中,当前hive只支持Derby和MySQL数据库。内部表: Hive中的表和传统数据库中的表在概念上是类似的,Hive的每个表都有自己的存储目录,除了外部表外,所有的表数据都存放在配置在hive-site.xml文件的$hive.metastore.warehouse.dir/table_name目录下。Java代码1. CREATETABLEIFNOTEXISTSstudents(user_noINT,nameSTRING,sexSTRING,2. gradeSTRINGCOMMOT班级)COMMONT学生表3. ROWFORMATDELIMITED4. FIELDSTERMINATEDBY,5. STOREASTEXTFILE;外部表: 外部表指向已经存在在Hadoop HDFS上的数据,除了在删除外部表时只删除元数据而不会删除表数据外,其他和内部表很像。Java代码1. CREATEEXTERNALTABLEIFNOTEXISTSstudents(user_noINT,nameSTRING,sexSTRING,2. classSTRINGCOMMOT班级)COMMONT学生表3. ROWFORMATDELIMITED4. FIELDSTERMINATEDBY,5. STOREASSEQUENCEFILE6. LOCATION/usr/test/data/students.txt;分区表: 分区表的每一个分区都对应数据库中相应分区列的一个索引,但是其组织方式和传统的关系型数据库不同。在Hive中,分区表的每一个分区都对应表下的一个目录,所有的分区的数据都存储在对应的目录中。 比如说,分区表partitinTable有包含nation(国家)、ds(日期)和city(城市)3个分区,其中nation = china,ds = 20130506,city = Shanghai则对应HDFS上的目录为: /datawarehouse/partitinTable/nation=china/city=Shanghai/ds=20130506/。Java代码1. CREATETABLEIFNOTEXISTSstudents(user_noINT,nameSTRING,sexSTRING,2. classSTRINGCOMMOT班级)COMMONT学生表3. PARTITIONEDBY(dsSTRING,countrySTRING)4. ROWFORMATDELIMITED5. FIELDSTERMINATEDBY,6. STOREASSEQUENCEFILE; 分区中定义的变量名不能和表中的列相同。桶区表: 桶表就是对指定列进行哈希(hash)计算,然后会根据hash值进行切分数据,将具有不同hash值的数据写到每个桶对应的文件中。Java代码1. CREATETABLEIFNOTEXISTSstudents(user_noINT,nameSTRING,sexSTRING,2. classSTRINGCOMMOT班级,scoreSMALLINTCOMMOT总分)COMMONT学生表3. PARTITIONEDBY(dsSTRING,countrySTRING)4. CLUSTEREDBY(user_no)SORTEDBY(score)INTO32BUCKETS5. ROWFORMATDELIMITED6. FIELDSTERMINATEDBY,7. STOREASSEQUENCEFILE; 内部表和外部表的主要区别: 1)、内部表创建要2步:表创建和数据加载,这两个过程可以同步执行。在数据加载的过程中,数据数据会移动到数据仓库的目录中;外部表的创建只需要一个步骤,表创建数据加载同时完成,表数据不会移动。 2)、删除内部表时,会将表数据和表的元数据一同删除;而删除外部表时,紧删除表的元数据而不会删除表数据。在上一节深入学习Programing Hive:Hive的数据模型(表)中,已经学习过表的定义,接下来接着学习Hive的DDL操作。复制表结构:Java代码1. CREATETABLEIFNOTEXISTSstudents2LIKEstudents;查看表结构:Java代码1. DESCRIBETABLEstudents;删除表:Java代码1. DROPTABLEstudents;创建视图: Hive中的视图(view)的概念和传统数据库中的表是相同的,是只读的,目前还不支持不支持物化视图。 如果在创建试图后,再将基本表中被视图引用的列修改,那么修改后的数据列将不会体现在视图中;如果基本表被删除或以不兼容的方式被修改,则查询该视图时会失败。Java代码1. CREATEVIEWIFNOTEXISTSview_students(user_no,name,score)2. AS3. SELECTuser_no,name,scoreFROMstudents;删除视图:Java代码1. DROPVIEWview_students;定制表存储方式:Java代码1. CREATETABLEIFNOTEXISTSemployees(2. noSTRING,3. nameSTRING,4. salaryFLOAT,5. subordinatesARRAY,6. deductionsMAP,7. addressSTRUCT8. )9. ROWFORMATDELIMITED10. FIELDSTERMINATEDBY00111. COLLECTINITEMSTERMINATEDBY00212. MAPKEYSTERMINATED00313. LINESTERMINATEDBYn14. STOREDAS15. INPUTFORMATorg.linkedin.haivvreo.AvroContainerInputFormat16. OUTPUTFORMATorg.linkedin.haivvreo.AvroContainerOutputFormat;修改表结构: 1)、重命名表Java代码1. ALTERTABLEtable_nameRENAMETOnew_table_name; 只修改了表名,不会改变表结构和数据存放的位置。 2)、修改列名、类型、位置及注释Java代码1. CREATETABLEIFNOTEXISTStest(aINT,bSTRING,cFLOAT);/创建测试表2. /修改列名3.4. TABLEtestCHANGEaa2INT;5. /*将a列的名字改为a2,并将其数据类型改为STRING,然后将之放在b列之后;修改6. *后的表结构为:bINT,a2STRING,cFLOAT7. */8. ALTERTABLEtestCHANGEaa2STRINGAFTERb;9. /*10. *将b列的名字改为b2,并将其数据类型由FLOAT改为DOUBLE,然后将之11. *放在第一列;修改后的表结构为:12. *b2DOUBLE,aSTRING,cFLOAT13. */14. ALTERTABLEtestCHANGEbb2DOUBLEFIRST; 列的改变只会修改Hive的元数据,而不改变实际的数据。用户应该确保元数据的定义和实际的数据结构保持一致。 3)、增加新列Java代码1. ALTERTABLEtestADDCOLOMNS(dINT,eSTRING); 4)、改变表的数据存储格式Java代码1. ALTERTABLEtestSETFILEFORMATSEQUENCEFILE; 5)、添加分区PartitionJava代码1. ALTERTABLEstudentsADDPARTITION(ds=2013-05-07,country=china)2. LOCATION/usr/test/data/test.txt; 6)、删除分区PartitionJava代码1. ALTERTABLEstudentsDROPPARTITION(ds=2013-05-07,country=china); 7)、创建函数Java代码1. CREATETEMPORARYFIUNCTIONaFuncasclass_name; 8)、删除函数Java代码1. DROPTEMPORARYFIUNCTIONaFunc; 9)、显示表Java代码1. SHOWTABLESstudents; 9)、显示分区Java代码1. SHOWPARTITIONSstudents;本节继续讨论HiveQL,Hive查询语言,如何向Hive表中添加数据,操纵数据和从表中将数据提取到文件系统。 之前已经学习过Hive表的创建,本节主要关注向表中填充数据,使表中有数据可供查询。 先行创建本节要使用的表employees:Java代码1. CREATETABLEemployees(2. nameSTRING,3. salaryFLOAT,4. subordinatesARRAYCOMMENT下属,5. deductionsMAPCOMMENT扣费,6. addressSTRUT7. )8. PARTITIONEDBY(countrySTRING,stateSTRING);向管理表(非外部表)中加载数据 由于Hive没有行级的insert,update和delete操纵,向表中加载数据的唯一方法就是“批量”加载数据。如下示例,想一个分区表中加载一批数据:Java代码1. LOADDATALOCALINPATH$env:HOME/calafornia-employees2. OVERWRITEINTOTABLEemployees3. PARTITION(country=US,state=CA); 在加载数据之前首先要要保证已经创建有符合条件的分区。在这个示例中,数据被加载后再Hive中的目录为:hdfs:/master_server/user/hive/warehouse/mydb.db/employees/country=US/state=CA这个示例需要注意几点:关键字OVERWRITE:加上该词说明如果之前已经箱盖分区中加载过数据的话,则之前的数据会首先被“清洗掉”,然后才加载新数据;如果没有加关键字OVERWRITE的话,如:Java代码1. LOADDATALOCALINPATH$env:HOME/calafornia-employees2. INTOTABLEemployees3. PARTITION(country=US,state=CA);就不会将已有的数据清洗,而是直接在原有数据后边追加新的数据。关键字LOCAL:表明是从本地文件系统的文件夹中加载数据,如果不加LOCAL关键字,则表明是从HDFS系统的文件夹中加载数据:Java代码1. LOADDATAINPATH$env:HOME/calafornia-employees2. INTOTABLEemployees3. PARTITION(country=US,state=CA); 另外一点就是,对于要指定要加载的文件的路径,指定一个文件夹是比较符合常规的,这要比每次单独指定文件夹中的一个具体的文件要好,这样Hive会一次把指定文件夹下的所有的位安全都拷贝到Hive仓库中。 Hive在加载数据时并不会管要加载的数据是否和表定义模式相匹配,但是会验证文件格式,比如说,在表中第一的保存的数据文件为SEQUENCEFILE,那么加载后的文件就必须为SEQUENCEFILE文件。通过HiveQL查询语句添加数据INSERT语句可以让用户通过一个HiveQL Query语句向Hive表中插入数据。看下面的一个示例(这里假设已经定义过表staged_employees):Java代码1. INSERTOVERWRITETABLEemployess2. PARTTITION(country=US,state=OR)3. SELECT*FROMstaged_employeesse4. WHEREty=USANDse.st=OR;OVERWRITE关键字,我们已经讨论过。但对于本示例来说,如果去掉OVERWRITE或用INTO替换掉,如:Java代码1. INSERTINTOTABLEemployess2. PARTTITION(country=US,state=OR)3. SELECT*FROMstaged_employeesse4. WHEREty=USANDse.st=OR; 那么Hive就会将数据以“追加”的方式插入数据到employess表。 这个示例在一个场景中特别有用:数据已经被保存在另外一个表中,如Hive的外部表,然后用户想把某些数据做最终的保存到分区表中;或者从原有的数据源表中将数据保存成符合用的要求的不同的数据记录的格式。 然而,如果staged_employees中数据特别大,有可能你需要执行很多次这样的插入查询导入数据的话,比如说美国部分的数据就要执行65次之多。Hive提供了另外一种INSERT语法,是你只扫描一次表就可以将数据插入到对应的分区中:Java代码1. ROMstaged_employeesse2. INSERTINTOTABLEemployess3. PARTTITION(country=US,state=OR)4. SELECT*WHEREty=USANDse.st=OR;5. INSERTINTOTABLEemployess6. PARTTITION(country=US,state=CA)7. SELECT*WHEREty=USANDse.st=CA;8. INSERTINTOTABLEemployess9. PARTTITION(country=US,state=IL)10. SELECT*WHEREty=USANDse.st=IL;11. . 这种INSERT语法也可以一次插入多个表。动态分区添加数据 就上例来说,好友一个问题,那就是如果有特别多的分区要创建的话,用户不得不要写许多HiveQL语句!幸运的是,Hive提供一个叫动态分区的功能,可以基于用户的查询参数推断要创建的分区。通过与动态分区相比较,之前我们讨论的分区插入数据被称为静态分区数据导入。 将上面的静态分区作如下修改,就变成动态分区数据导入的示例:Java代码1. INSERTOVERWRITETABLEemployees2. PARTITION(country,state)3. SELECT.,ty,se.st4. FROMstaged_employeesse 对于本例来说,Hive会通过SELECT语句中最后两列ty和se.st的值来决定employees表中的分区的key,contry和state。Hive在动态分区插入操作中特别强调源表的数据列的值和要插入分区的key的值的位置关系,而不是通过名字匹配,这也是为什么在staged_employees表中给国家和州定义不同的名字的原因。 假设staged_employees有100个国家和州的匹配对儿,那么执行玩这个HiveQL语句后,employees就会有100个国家分区! 用户也可以混合使用动态分区和静态分区数据插入,如下例中,我们是用了一个静态的country(US)和动态的州的值:Java代码1. INSERTOVERWRITETABLEemployees2. PARTITION(country=US,state)3. SELECT.,ty,se.st4. FROMstaged_employeesse5. WHEREty=US;要注意的是,必须要把静态分区的key放在动态分区的key之前。 默认请情况下,动态分区插入的功能是被禁用的,当被激活后,Hive默认会工作在“严格(strict)”模式下。在“严格(strict)”模式下,必须使用静态分区和动态分区混合使用的方式,这主要是避免一些不好的数据查询设计。 要使用动态模式,用户首先要激活动态分区的一些参数设置:Java代码1. hivesethibe.exec.dynamic.partition=true;2. hivesethibe.exec.dynamic.mode=nonstrict;3. hivesethibe.exec.max.dynamic.partitions.pernode=1000;4. 5. hiveINSERTOVERWRITETABLEemployeesPARTITION(country,state)6. SELECT.,ty,se.stFROMstaged_employeesse;nonstrict可以完全由用户的查询参数来动态创建所有的分区。在一个HiveQL中创建表和加载数据 在Hive中,用户可以完全使用一条语句创建表并同时加载数据:Java代码1. CREATETABLEca_employees2. ASSELECTnamesalary,address3. FROMemployees4. WHEREstate=CA; 这种方法特别适用于在一个大表中提取一个子数据集的场景,这种功能不适合外部表,因外外部表是在定义时直接给其制定一个数据文件的路径。导出数据 之前讲的都是如何将数据加载到Hive表中,那么如何将表中数据导出表呢?用户可以使用INSERT . DIRECTORY .语句导出数据,示例如下:Java代码1. INSERTOVERWRITELOCALDIRECTORYtmp/ca_employees2. SELECTname,salary,address3. FROMemployees4. WHEREstate=CA; 其中OVERWRITE和LOCAL的意义同上。 和加载数据一样,用户同样可以在一个语句中将数据导出到多个文件夹:Java代码1. FROMstaged_employeesse2. INSERTOVERWRITEDIRECTORY/tmp/or_employees3. SELECT*FROMty=USANDse.st=OR4. INSERTOVERWRITEDIRECTORY/tmp/CA_employees5. SELECT*FROMty=USANDse.st=CA6. INSERTOVERWRITEDIRECTORY/tmp/IL_employees7. SELECT*FROMty=USANDse.st=IL前几章已经学习过Hive表的定义和数据操纵,本章我们开始学习HiveQL查询。SELECT . FROM .查询 SELECT在SQL中是一个投影操作。让我们从新来看之前定义过的分区表employees:Java代码1. CREATETABLEemployees(2. nameSTRING,3. salaryFLOAT,4. subordinatesARRAYCOMMENT下属,5. deductionsMAPCOMMENT扣费,6. addressSTRUT7. )8. PARTITIONEDBY(countrySTRING,stateSTRING); SELECT查询:Java代码1. hiveSELECTname,salaryFROMemployees;2. JohnDoe100000.03. MarySmith80000.04. ToddJones70000.05. BillKing60000.0 用户也可以给FROM之后的表,视图或子查询起一个别名,如:Java代码1. hiveSELECTe.name,e.salaryFROMemployeese; 上面两个HiveQL语句是相同的,给表起别名在JOIN操作中特别有用。 下面我们来看如何查询employees表中的集合类型的数据。我们先看一下如何查询ARRAY类型的数据,如employees表的下属“subordinates”Java代码1. hiveSELECTname,subordinatesFROMemployees;2. JohnDoeMarySmith,ToddJones3. MarySmithBillKing4. ToddJones5. Billking 再看MAP类型的查询,如“deductions”:Java代码1. hiveSELECTname,deductionsFROMemployees;2. JohnDoeFederalTaxes:0.2,StateTaxes:0.05,Insurance:0.13. MarySmithFederalTaxes:0.2,StateTaxes:0.05,Insurance:0.14. ToddJonesFederalTaxes:0.15,StateTaxes:0.03,Insurance:0.15. BillKingFederalTaxes:0.15,StateTaxes:0.03,Insurance:0.1 再看STRUCT类型的查询,如“address”:Java代码1. hiveSELECTname,addressFROMemployees;2. JohnDoeStreet:1MichignAve.,city:Chicago,State:IL,ZIP:606003. MarySmithStreet:100OntarioSt.,city:Chicago,State:IL,ZIP:606014. ToddJonesStreet:200ChicagoAve.,city:OakPark,State:IL,ZIP:607005. BillKingStreet:300ObscureDr.,city:Obscuria,State:IL,ZIP:60100 接下来我们再看如何查看集合性属性字段中的数据:Java代码1. hiveSELECTname,subordinates0,deductionsStateTaxes,address.cityFROMemployees;2. JohnDoeMarySmith0.05Chicago3. MarySmithBillKing0.05Chicago4. ToddJonesNULL0.03OakPark5. BillKingNULL0.03Obscuria使用正则表达式查询符合条件的列 在Hive查询中,用户可以使用正则表达式查询符合条件的列,下面的实例中就是使用正则表达式的使用用例,可以查询到symbol列和所有以“price”开头的列:Java代码1. hiveSELECTsymbol,price.*FROMstocks;2. AAPL195.69197.88194.0194.12194.123. AAPL192.63196.0190.85195.46195.464. AAPL196.73198.37191.57192.05192.055. AAPL195.17200.2194.42199.23199.236. AAPL195.91196.32193.38195.86195.867. .列计算 在HiveQL中,用户不但可以从表中查询某些列,还可以通过函数或数学表达式来计算列的值。例如,我们可以在employees表中查询雇员的姓名,薪水,联邦税百分百及其他列的值:Java代码1. hiveSELECTupper(name),salary,deductionsFederalTaxes,2. round(salary*(1-deductionsFederalTaxes)3. FROMemployees;4. JOHNDOE100000.00.2800005. MARYSMITH80000.00.2640006. TODDJONES70000.00.15595007. BILLKING60000.00.1551000 Hive是使用JAVA写的开源软件,在函数或数学表达式来计算列的值时类型转型和JAVA的转型相同。聚合函数 要在HiveQL查询中使用聚合函数,必须先将hive.map.aggr配置参数设置为true,举例如下:Java代码1. hiveSEThive.map.aggr=true;2. hibeSELECTcount(*),avg(salary)FROMemployees; 但是将Java代码1. hive.map.aggr设置为true会占用更多的内存。LIMIT 一次典型的HiveQL查询可能会返回所有符合条件的数据记录,但是LIMIT关键字可以限制返回的记录的条数:Java代码1. hiveSELECTupper(name),salary,deductionsFederalTaxes,2. round(salary*(1-deductionsFederalTaxes)3. FROMemployees4. LIMIT2;5. JOHNDOE100000.00.2800006. MARYSMITH80000.00.264000给列奇别名Java代码1. hiveSELECTupper(name),salary,deductionsFederalTaxesAS2. fed_taxes,round(salary*(1-deductionsFederalTaxes)AS3. salary_minus_fed_taxes4. FROMemployees5. LIMIT2;6. JOHNDOE100000.00.2800007. MARYSMITH80000.00.264000子查询 给列起别名特别适合与子查询中的列,让我们将上个查询示例修改为子查询的使用用例:Java代码1. hiveFROM(2. SELECTupper(name),salary,deductionsFederalTaxesAS3. fed_taxes,round(salary*(1-deductionsFederalTaxes)4. ASsalary_minus_fed_taxes5. FROMemployees6. )e7. SELECTe.name,e.salary_minus_fed_taxes8. WHEREe.salary_minus_fed_taxes70000;9. JOHNDOE100000.00.280000CASE . WHEN . THEN语句 CASE . WHEN . THEN向标准的SQL语句中一样使用在SELECT列中,对某一个列的返回值做判断,示例如下:Java代码1. hiveSELECTname,salary,2. CASE3. WHENsalaryWHENsalary=50000.0ANDsalaryWHENsalary=70000.0ANDsalayENDASbracketFROMemployees;8. JohnDoe100000.0veryhigh9. MarySmith80000.0high10. ToddJones70000.0high11. BillKing60000.0middle12. BossMan200000.0veryhigh13. FredFinance150000.0veryhigh14. StcyAccountant60000.0middleWHERE过滤条件SELECT决定返回哪些数据列,而WHERE决定返回那些符合条件的数据:Java代码1. hiveSELECTname,salary,deductionsFederalTaxes,2. salary*(1-deductionsFederalTaxes)3. FROMemployees4. WHEREround(salary*(1-deductionsFederalTaxes)5. 70000;6. ohnDoe100000.00.280000.0 该示例有一个问题,那就是salary * (1 - deductionsFederal Taxes)分别在SELECT部分和WHERE部分都执行了,性能上不是多优化。那么,对salary * (1 - deductionsFederal Taxes)使用别名能否消除这种冲突呢?,不幸的是这是无效的:Java代码1. hiveSELECTname,salary,deductionsFederalTaxes,2. salary*(1-deductionsFederalTaxes)AS3. salary_minus_fed_taxes4. FROMemployees5. WHEREround(salary_minus_fed_taxes)70000;6. FAILED:Errorinsemanticanalysis:Line4:13Invalidtablealiasor7. colomnreferencesalary_minus_fed_taxes:(possiblecolomnnames8. are:name,salary,subordinates,deductions,address) 如错误信息中所说,用户不能在WHERE部分中引用列的别名,那么我们是否可以使用其他办法来消除这种冲突呢?答案是使用子查询:Java代码1. hiveSELECTe.*FROM2. (SELECTname,salary,deductionsFederalTaxesASded,3. salary*(1-deductionsFederalTaxes)AS4. salary_minus_fed_taxes5. FROMemployees)e6. WHEREround(salary_minus_fed_taxes)70000;浮点比较陷阱 在WHERE查询条件中:在比较不同类型的数值(如FLOAT vs DOUBLE)时,会引发浮点比较陷阱。 看下面的HiveQL语句,本来只想要查询Federal Taxes 0.2,但是返回结果如下:Java代码1. hiveSELECTname,salary,deductionsFederalTaxes2. FROMemployeesWHEREdeductionsFederalTaxes0.2;3. JohnDoe100000.00.24. MarySmith80000.00.25. BossMan200000.00.36. FredFinance150000.00.3 我们发现,为什不符合过滤条件(deductions(Federal Taxes) = 0.2)的结果也返回了?!这就是浮点比较陷阱引发的。 那么如何来避免这个陷阱呢?那就要将0.2强制转型了:Java代码1. hiveSELECTname,salary,deductionsFederalTaxes2. FROMemployees3. WHEREdeductionsFederalTaxescast(0.2ASFLOAT);4. BossMan200000.00.35. FredFinance150000.00.3LIKE和RLIKELIKE标识模糊查询:Java代码1. hiveSELECTname,address.streetFROMemployeesWHEREaddress.streetLIKE%Ave.;2. JohnDoe1MichiganAve.3. ToddHones200ChicagoAve.4. 5. hiveSELECTname,address.streetFROMemployeesWHEREaddress.streetLIKE%Chi%;6. ToddHones200ChicagoAve.RLIKE是使用正则表达式:Java代码1. hiveSELECTname,address.streetFROMemployees2. WHEREaddress.streetRLIKE.*(Chicago|Ontario).*;3. MarySmith100OntarioSt.4. ToddJones200ChicagoAve.GROUP BY Hive的GROUP BY语句和传统的SQL相同,经常要和聚合函数一块儿使用,我们再看一下stocks表的定义:Java代码1. CREATEXTENALTABLEIFNOTEXISTSstocks(2. exchangeSTRING,3. symbolSTRING,4. ymdSTRING,5. price_openFLOAT,6. price_highFLOAT,7. price_lowFLOAT,8. price_closeFLOAT,9. volumeINT,10. price_adj_closeFLOAT)11. ROWFORMATDELIMITEDFIELDSTERMINATEDBY,12. LOCATION/data/stocks; 示例如下:Java代码1. hiveSELECTyear(y
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 考试试卷


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!