HadoopHive实战
HadoopHiveHadoopHive 实战实战 1 1内部表内部表 1.11.1创建表并加载数据创建表并加载数据 第一步 启动 HDFS、YARN和 Hive,启动完毕后创建Hive 数据库 hivecreate database hive; hiveshow databases; hiveuse hive; 第二步 创建内部表 由于 Hive 使用了类似 SQL 的语法,所以创建内部表的语句相对 SQL 只增加了行和字段分隔 符。 hiveCREATE TABLE SOGOUQ2(DT STRING,WEBSESSION STRING,WORD STRING,S_SEQ INT,C_SEQ INT,WEBSITE STRING) ROW AT DELIMITED FIELDS TERMINATED BY \t LINES TERMINATED BY \n ; 第三步 加载数据 数据文件可以从 HDFS 或者本地操作系统加载到表中,如果加载HDFS 文件使用 LOAD DATA INPATH,而加载本地操作系统文件使用LOAD DATA LOCAL INPATH命令。HIVE 表保存的默认 路径在${HIVE_HOME}/conf/hive-site.xml配置文件的 hive.metastore.warehouse.dir属性指定, 当创建表时会在 hive.metastore.warehouse.dir指向的目录下以表名创建一个文件夹, 在本演 示中表默认指向的是/user/hive/warehouse。 数据文件在本地操作系统将复制到表对应的目录中,而数据文件在HDFS 中,数据文件将移 动到表对应的目录中,原来的路径将不存在该文件。在这里使用《Spark 编程模型(上)-- 概念及 Shell 试验》中在本地操作系统中的搜狗日志数据文件: hiveLOAD DATA LOCAL INPATH /home/hadoop/upload/sogou/SogouQ2.txt INTOTABLE SOGOUQ2; 在/user/hive/warehouse/hive.db/sogouq2目录下,可以看到 SougouQ2.txt数据文件: 1.21.2查询行数查询行数 可以用 count 关键字查询 SogouQ2.txt数据行数,查询时会启动 MapReduce 进行计算,Map 的个数一般和数据分片个数对应,在本查询中有2 个 Map 任务(数据文件有 2 个 Block), 1 个 Reduce 任务。 hiveselect count(*) from SOGOUQ2; 2 2外部表外部表 2.12.1创建表关联数据创建表关联数据 第一步 在 HDFS 创建外部表存放数据目录 $hadoopfs -mkdir -p /class5/sogouq1 $hadoopfs -ls /class5 第二步 在 Hive 创建外部表,指定表存放目录 hiveCREATE EXTERNAL TABLE SOGOUQ1(DT STRING,WEBSESSION STRING,WORD STRING,S_SEQ INT,C_SEQ INT,WEBSITE STRING) ROW AT DELIMITED FIELDS TERMINATED BY \t LINES TERMINATED BY \n STORED AS TEXTFILE LOCATION /class5/sogouq1 ; hiveshow tables; 观察一下创建表和外部表的区别,会发现创建外部表多了EXTERNAL 关键字以及指定了表对 应存放文件夹 LOCATION‘/class5/sogouq1’ 【注】在删除表的时候,内部表将删除表的元数据和数据文件;而删除外部表的时候, 仅仅 删除外部表的元数据,不删除数据文件 第三步 加载数据文件到外部表对应的目录中 创建 Hive 外部表关联数据文件有两种方式,一种是把外部表数据位置直接关联到数据文件 所在目录上,这种方式适合数据文件已经在HDFS 存在,另外一种方式是创建表时指定外部 表数据目录,随后把数据加载到该目录下。以下将以第二种方式进行演示: $hadoopfs -copyFromLocal /home/hadoop/upload/sogou/SogouQ1.txt /class5/sogouq1/ $hadoopfs -ls /class5/sogouq1 $hadoopfs -tail /class5/sogouq1/SogouQ1.txt 2.22.2查询行数查询行数 hiveselect count(*) from SOGOUQ1; 2.32.3显示前显示前 1010 行行 hiveselect * from SOGOUQ1 limit 10; 可以看出 Hive 会根据查询不同任务决定是否生成Job, 获取前 10 条并没有生成 Job, 而是得 到数据后直接进行显示。 2.42.4查询结果排名第查询结果排名第 1 1,点击次序排第,点击次序排第 2 2 的数据的数据 hiveselect count(*) from SOGOUQ1 where S_SEQ=1 and C_SEQ=2; 2.52.5查询次数排行榜查询次数排行榜 按照 session 号进行归组,并按照查询次数进行排序,最终显示查询次数最多的前10 条。 hiveselect WEBSESSION,count(WEBSESSION) as cw from SOGOUQ1 group by WEBSESSION order by cwdesc limit 10;