一、Hive的基本概念1.1什么是hive?(1)Hive是基于Hadoop数据仓库的基础设施;(2)相当于Hadoop上的一个客户端,可以用来存储、查询和分析存储在Hadoop中的数据;(3)是一个SQL解析引擎,将SQL转换成Map/Reduce作业在Hadoop上执行。1.2hive的数据存储特点(1)数据存储是基于Hadoop的HDFS;(2)没有特殊的数据存储格式;(3)存储结构主要包括:数据库、文件(默认可以直接加载文本文件)、表、视图、索引;说明:hive中的表本质上就是HDFS的目录,按照表名来分隔文件夹。如果是分区表,分区值为子文件夹。这些数据可以直接在M/R中使用。hive中的数据存储在HDFS中。2、hive体系结构存储hive元数据(表及表属性、数据库名称等)分析执行hiveQL语句,将执行计划下发给hadoop,转为map/reduce执行2.1hive体系结构-metastore存储方式default情况下,元数据使用内嵌的derby数据库作为存储引擎,将存储的数据分离,支持多用户同时访问,分离metastore,调用远程方法3.hive的安装和使用HIVE_HOME/conf/修改文件cphive-default.xml.templatehive-site.xmlcphive-env.sh.templatehive-env.sh修改$HIVE_HOME/bin下的hive-env.sh,添加如下三行HADOOP_HOME=--hadoophomeDirectoryexportHIVE_CONF_DIR=--hive的conf目录exportHIVE_AUX_JARS_PATH=--hive的lib目录有效文件:source/hive-env.sh(有效文件)3.2配置MySQLmetastore修改$HIVE_HOME/conf/hive-site.xmljavax.jdo.option.连接网址jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=truejavax.jdo。option.ConnectionDriverNamecom.mysql.jdbc.Driverjavax.jdo.option.ConnectionUserNameroot属性>;javax.jdo.option.ConnectionPassword1234563.3修改配置hive临时目录$HIVE_HOME/conf/hive-site.xml(1)设置数据目录hive.metastore.warehouse.dir/usr/local/hive/warehouse(2)设置临时文件目录hive.exec.scratdir/usr/local/hive/tmp(3)hive相关日志目录hive.querylog.location/usr/local/hive/log3.4Hive的运行模式指定Hive的运行模式是任务的执行环境,分为本地和本地两种簇。我们可以通过mapred.job.tracker指定本地模式的设置方式:hive>setmapred.job.tracker=local;hive>sethive.exec.mode.local.auto=true;hive.exec.mode.local.auto。输入字节。maxdefault128M3.5sqoop安装(一)下载解压:tar-zxvfsqoop-1.4.4.bin__hadoop-2.0.4-alpha.tar.gz/rootcd/rootln-ssqoop-1.4.3.binsqoop(二)配置sqoop:vi~/.bash_profileexportSQOOP_HOME=/usr/local/sqoopexportPATH=$SQOOP_HOME/bin:$PATH(3)测试连接数据库并列出数据库:sqooplist-databases--connectjdbc:mysql://localhost:3306/--usernameroot--password123456(4)导入表在mysql中配置hive:sqoopimport--connectjdbc:mysql://localhost:3306/gwifi--usernameroot--password123456--tablethink_access--hive-import-m1;3.6hive的命令行方式1、输入#/hive/bin/hive执行应用,或者#hivehive>createtabletest(idint,namestring);hive>showtables;hive>quit;查看和修改表和目录的关系#hadoopfs-ls/user/hive/warehouse/修改参数:hive.metastore.warehouse.dir表与目录的对应关系3.6在命令行中显示或修改参数值代码中可以通过${...}来使用namespace使用权限说明hivevar可读写$hive-dname=张三;hiveconf可读写入$hive--hiveconfhive.cli.print.current.db=true;$hive–hiveconfhive.cli.print.header=true;system可以读写java定义的配置属性,如system:user.nameenv只读shell环境变量,如env:USER3.7hive脚本运行$>hive-i/home/my/hive-init。sql$hive>与linux交互的源文件!!ls!pwd与hdfs交互命令dfs-ls/dfs-mkdir/hive3.8hivejdbc方式JAVAAPI交互执行方式hive远程服务(端口号10000)启动方式3.9hive常用命令–set命令hive控制台设置命令:sethive.cli.print.current.db=true;sethive.metastore.warehouse.dir=/hivehive参数初始化配置设置命令:~/.hiverc4.HiveQL数据操作4.1数据类型1.基本数据类型:同mysql其他数据库中的基本数据类型类似;2、复合数据类型:(1)array数组类型如:array[int]下标访问(2)struct结构类型如:struct{name:STRING,age:INT}.access(3)Map结构4.2定义与数据库/表的操作默认使用“default”数据库,使用命令选择数据库:hive>使用<数据库名>创建数据库:createdatabase<数据库名>查看所有数据库:showdatabases;查看/删除数据库:desc/dropdatabase<数据库名称>;注意:Hive没有行级别的插入、更新和删除操作。向表中插入数据的唯一方法是使用批量加载操作hive>createtable表名(字段名字段类型,...)hive>showtables;hive>createtablet2liket1;hive>droptable表名—删除表添加列hive>ALTERTABLEt3ADDCOLUMNS(性别);mysql中hive数据库中的显示表;可以在TBLS表中查看到hie创建的表4.3数据库/表的定义和操作插入数据:insertoverwritetablet_table1select*fromt_table1whereXXXX;删除数据:insertoverwritetabletestselect*fromtestwhere1=0;数组类型表操作:定义复合数据类型表:createtabledemo_array(idint,mydataarray[string])PARTITIONEDBY(dtSTRING)rowformatdelimitedfieldsterminatedby'\t'collectionitemsterminatedby'|';--id和mydata之间用'\t'隔开,后面的mydata数据以“|”分隔4.3.1Hive数据模型——管理表管理表,又称内表或受控表特点:(1)所有数据都存放在仓库目录下;(2)删除表时,表中的元数据和数据也会被删除;(3)建表和数据加载可以在同一条语句中实现;(4)每张表在HDFS中都有一个对应的目录,用于存放该表的数据(5)在加载数据的过程中,会将实际数据移动到数据仓库目录下;数据访问在数据仓库目录中完成。4.3.1Hive的数据模型-管理表Createdatafileinner_table.datCreatetablehive>createtableinner_table(keystring)rowformatdelimitedfieldsterminatedby'\t';//这个必须指定,否则加载时数据为NULL;加载数据配置单元>将数据本地inpath'/root/inner_table.dat'加载到表inner_table中;查看数据select*frominner_tableselectcount(*)frominner_tabledeletetabledroptableinner_table4.3.2Hive数据模型-外部表包含externable的表称为externaltable特点:(1)只删除externaltable删除metastore元数据,不删除表数据在高清文件中;(2)加载数据和建表同时完成,不会移动数据,只与外部数据建立链接;删除一个外部表,直接删除这个链接(3)指向HDFS4.3.2Hive的数据模型中已经存在的数据-外部表语法CREATEEXTERNALTABLEpage_view(viewTimeINT,useridBIGINT,page_urlSTRING,referrer_urlSTRING,ipSTRINGCOMMENT'IPAddressoftheUser',countrySTRINGCOMMENT'countryoforigination')COMMENT'ThisisthestagingINpageFIATELYTABLE'ROIMWFORMATDBEL'LINESTERMINATEDBY'12'STOREDASTEXTFILELOCATION'hdfs://centos:9000/user/data/staging/page_view';4.3.3Hive的数据模型——分区表分区可以理解为分类,通过分类将不同类型的数据放在不同的目录下;分类标准为分区字段,可以是一个也可以是多个;分区表的意义在于优化查询,查询时尽量使用分区字段;如果不使用分区字段,则将全部扫描。创建数据文件partition_table.dat创建表createtablepartition_table(rectimestring,msisdnstring)partitionedby(daytimestring,citystring)以'\t'结尾的行格式分隔字段存储为TEXTFILE;将数据加载到分区将数据本地inpath'/home/partition_table.dat'加载到表partition_table分区(daytime='2013-02-01',city='bj');查看数据select*frompartition_tableselectcount(*)frompartition_tabledeletetabledroptablepartition_table4.3.4Hive的数据模型-分区表CREATETABLEtmp_table#tablename(titlestring,#fieldnamefieldtypeminimum_biddouble,quantitybigint,have_invoicebigint)COMMENT'Comment:XXX'#tablecommentPARTITIONEDBY(ptSTRING)#分区表字段(如果你的文件很大,可以使用分区表快速过滤出分区字段划分的数据)ROWFORMATDELIMITEDFIELDSTERMINATEDBY'\001'#STOREDASSEQUENCEFILE分隔的字段是什么;#用什么方法来存储数据,SEQUENCEFILE是hadoop自带的文件压缩格式4.4.1从文件加载数据Loaddatahive>LOADDATA[LOCAL]INPATH'...'[OVERWRITE]INTOTABLEt2[PARTITION(province='beijing')];reloaddatathroughquerytablehive>INSERTOVERWRITETABLEt2PARTITION(province='beijing')')SELECT*FROMxxxWHERExx设置并行作业数hive.exec.parallel=真;hive.exec.parallel.thread.number=3;4.4.2动态分区加载数据启用动态分区支持hive>sethive.exec.dynamic.partition=true;hive>sethive.exec.dynamic.partition.mode=nostrict;hive>sethive.exec.max.dynamic.partitions.pernode=1000;#查询字段同hive>INSERTOVERWRITETABLEt3PARTITION(province,city)SELECTt.province,t.cityFROMtempt;hive>INSERTOVERWRITETABLEt3PARTITION(province='bj',city)SELECTt.province,t.cityFROMtempWHEREt.province='bj';单条语句同时创建表和加载数据hive>CREATETABLEt4ASSELECT....selectcount(0)from(selectidfromtestwherenamelike'zh%')ajoin(selectidfromtestwherenamelike'%i%')bona.id=b.id;五、hive存储格式比较hive在建表时,可以通过'STOREDASFILE_FORMAT'指定存储文件格式如下:1.TextFile:存储空间大,压缩后的文件不能拆分合并,查询效率低;可直接存储,加载速度最快;2.sequencefile:hadoopAPI支持提供的二进制文件,存储空间最大,可分可合并,查询效率高,需要文本文件转换加载3.rcFile:是一种结合了行和列存储的存储方式。(1)将数据按行分块,保证同一条记录在一个块中,避免读取一条记录需要读取多个块;(2)块数据的列式存储有利于数据压缩和快速列访问。查询效率最高,存储空间最小,但加载最慢的总结