hive使用案例
Spark进阶(六)安装好了hive的远程模式。
Continue:
http://www.sogou.com/labs/resource/q.php 中下载gz格式
//SogouQ1.txt、SogouQ2.txt、SogouQ3.txt分别是用head -n 或者tail -n 从SogouQ数据日志文件中截取
//访问时间\t用户ID\t[查询词]\t该URL在返回结果中的排名\t用户点击的顺序号\t用户点击的URL
使用方式:
在slave1上建表
//由'\t' 分割列与列,'\n'分割行与行
建的是外部表,所以需要指定存储的路径
CREATE EXTERNAL TABLE SOGOUQ1(DT STRING,WEBSESSION STRING,WORD STRING,S_SEQ INT,C_SEQ INT,WEBSITE STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' STORED AS TEXTFILE LOCATION '/dataguru/data/SogouQ1';
在slave1上可以通过该表执行对slave2的hdfs远程调用,使用示例:
//查询有多少行数据
Select count(*) from SOGOUQ1;
//显示前10行数据
select * from SOGOUQ1 limit 10;
//搜索结果排名第1,但是点击次序排在第2的数据有多少?
select count(*) from SOGOUQ1 where S_SEQ=1 and C_SEQ=2;
//搜索用户点击的URL含baidu的数据有多少?
select count(*) from SOGOUQ1 where WEBSITE like '%baidu%';
//搜索结果排名第1,但是点击次序排在第2,URL含baidu的数据有多少?
select count(*) from SOGOUQ1 where S_SEQ=1 and C_SEQ=2 and WEBSITE like '%baidu%';
//session查询次数排行榜
select WEBSESSION,count(WEBSESSION) as cw from SOGOUQ1 group by WEBSESSION order by cw desc limit 10;
(主要还是复习一下排行榜)
//创建内部表并加载数据,**原数据被移动到默认路径
CREATE TABLE SOGOUQ2(DT STRING,WEBSESSION STRING,WORD STRING,S_SEQ INT,C_SEQ INT,WEBSITE STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' ;
//使用show tables;来查看是否表建好
//如果在本地加载的话,需要加一个Local,现在是将hdfs上的文件加载上(现在可以发现:/user/hive/warehouse/sogouq2里面出现加载进该表的SogouQ2.txt)
LOAD DATA INPATH '/dataguru/data/SogouQ2.txt' INTO TABLE SOGOUQ2;
使用下列命令尝试:
//session查询次数排行榜
select WEBSESSION,count(WEBSESSION) as cw from SOGOUQ1 group by WEBSESSION order by cw desc limit 10;
//查询有多少行数据
Select count(*) from SOGOUQ2;
hive的补充
1.hive的jar包替换hadoop较低版本的相同的jar包:用hive/lib/jline-.jar替换hadoop/yarn/相同的bao
2.hive-env.sh中 除了上次提到的hadoop_home
修改hive_home和hive_conf_dir
shark部分可以了解
shark安装
源码下载,解压缩
源码编译
SHARK_HADOOP_VERSION=2.2.0 SHARK_YARN=true sbt/sbt assembly
//这里的版本信息可以进入project中的SharkBuild.scala中查看
//编译后拷贝到各子节点worker上
修改配置文件
//shark-env.sh
export SPARK_MEM=2g
# (Required) Set the master program's memory
export SHARK_MASTER_MEM=1g
# (Optional) Specify the location of Hive's configuration directory. By default,
# Shark run scripts will point it to $SHARK_HOME/conf
export HIVE_CONF_DIR="/app/hadoop/hive013/conf"
# For running Shark in distributed mode, set the following:
export HADOOP_HOME="/app/hadoop/hadoop220"
export SPARK_HOME="/app/hadoop/spark091"
export MASTER="spark://hadoop1:7077"
scp到个节点
****************************************************
****************************************************
启动hive metasotre service
nohup bin/hive --service metastore > metastore.log 2>&1 &
启动shark
bin/shark
./bin/shark –service sharkserver <port>
./bin/shark -h <server-host> -p <server-port>
2.使用演示:
启动slave2的hive metasotre service
nohup bin/hive –service metastore > metastore.log 2>&1 &
master上启动shark
bin/shark
//此时查看master:8080可以发现APPlication信息
这里是Shark基于内存的特性(怎么觉得演示着都在slave1上操作?):
//建立cache表(好神奇?你说是cache就cache?!)
create table sogouQ1_cached as select * from sogouq1;
//搜索结果排名第1,但是点击次序排在第2的数据有多少?
select count(*) from sogouQ1_cached where S_SEQ=1 and C_SEQ=2;
//搜索用户点击的URL含baidu的数据有多少?
select count(*) from sogouQ1_cached where WEBSITE like '%baidu%';
//搜索结果排名第1,但是点击次序排在第2,URL含baidu的数据有多少?
select count(*) from sogouQ1_cached where S_SEQ=1 and C_SEQ=2 and WEBSITE like '%baidu%';
//session查询次数排行榜
select WEBSESSION,count(WEBSESSION) as cw from sogouQ1_cached group by WEBSESSION order by cw desc limit 10;
* SparkSQL第一步*
在master上
1.将mysql-connector-java-..-bin.jar路径添加到Spark_ClassPath下,启动Spark脚本:
$ Spark_CLASSPATH = $ Spark_CLASSPATH:/.../mysql-connector-java-..-bin.jar ./bin/spark-shell --master spark://master:7077
2.这样在hive中建的表可以通过sqlContext进行查询,同样在SparkSQL中建的表也可以在hive中查看:
//这东西还是要的。。
val sqlContext= new org.apache.spark.sql.SQLContext(sc)
import sqlContext._
sqlContext.sql("show tables").show
sqlContext.sql("CREATE TABLE test(foo INT,bar SRTING)")
下面演示关于SparkSQL的具体的操作:
- 建“表结构”, 基于该“表结构”以RDD操作
- 存储为表
- 使用sql查询进行表的查询
- 并将查询结果(DSL)以RDD操作输出
case class Person(name:String,age:Int)
val people=sc.textFile("hdfs://master:8000/dataguru/week4/people.txt").map(_.split(",")).map(p=>Person(p(0),p(1).trim.toInt))
people.registerAsTable("people")
val teenagers = sqlContext.sql("SELECT name FROM people WHERE age >= 13 AND age <= 19")
teenagers.map(t => "Name: " + t(0)).collect().foreach(println)