Hive项目实战笔记
(本人的学习笔记,可转载但请跟我说一声并在引用文中说明出处,希望和大家共同进步?)
验证正则表达式是否正确的网站:
http://wpjam.qiniudn.com/tool/regexpal/
方式:上写正则表达式,下写某一个具有代表性的原始数据,进行校验。
(底下显示字体全部是黄色highlight说明正确,网址被清除?)
*Hive官方网站中GettingStarted文件包含了hive的所有重点,极具参考价值
思路:1.创建原表
2.针对不同业务创建不同子表
1⃣️数据存储格式处理(orcfile/parquet压缩)
2⃣️数据压缩(snappy)
3⃣️map输出结果进行数据压缩(snappy)
4⃣️外部表
5⃣️分区表
一 创建表并导入日志数据
二 使用RegexSerDe处理 Apache或Ngnix日志文件
1.筛选数据,剔除无效数据
2.使用开头描述的正则表达式对数据进行整理,统一格式
三 依据原表创建子表并设置orcfile存储和snappy压缩数据
根据需求创建子表
eg:drop table if exists 【子表文件名】;
create table IF NOT EXISTS 【子表文件名】 (
remote_addr string, //业务需求之ip地址
time_local string, //访问时间
request string, //请求地址
http_referer string //转入链接
)
ROW FORMAT DELIMITED FIELDE TERMINATED BY ‘\t’
//储存为orc并用snappy进行数据压缩
STORED AS orc tblproperties (“orc.compress”=“SNAPPY”);
insert into table 【子表文件名】 select remote_addr, time_local, request, http_referer from 【原表文件名】;
四 数据清洗之自定义UDF去除数据双引号
1.新建java类,自命名【RemoveQuotesUDF】
2.代码eg:public class RemoveQuotesUDF extends UDF {
public Text evaluate(Text str){
//validate 验证
if (null == str){
return new Text();
if (null == str.toString()){
return new Text();
}
//remove,用空格替代所有双引号
return new Text (str.toString().replaceAll("""," "));
}
public static void main(String[] args){
//检测功能是否可用,输出是否正常(这里的双引号要用转换字符)
System.out.println (new RemoveQuotesUDF().evaluate (new Text (“\”XXXXXXXXX\””)
}
}
3.打包导出Export,保存成JAR包,用FileZilla传入Linux /opt/datas
4.添加Jar包
add jar /opt/datas/hiveudf2.jar ;
create temporary function my_removequotes as “【第2点中的完整类名,例如com.beifeng.senior.hive.udf.RemoveQuotesUDF】”;
5.覆盖【三】黄色highlight语句
insert overwrite table 【子表文件名】 select my_removequotes(remote_addr), my_removequotes(time_local), my_removequotes(request), my_removequotes(http_referer) from 【原表文件名】;
6.查询检验双引号是否去除
select * from【子表文件名】limit 5; //查询5行数据
五 数据清洗之自定义UDF转换日期时间格式(重要,常用)
例如:将 【31/Aug/2015:00:04:37 +0800】 转换成 【20150831000437】
1.新建java类,自命名【DateTransformUDF】
2.代码eg:public class DateTransformUDF extends UDF{
private final SimpleDateFormat inputFormat = new SimpleDateFormat(“dd/MMM/yyyy:HH:mm:ss”, Local ENGLISH)
private final SimpleDateFormat outputFormat = new SimpleDateFormat(“yyyyMMddHHmmss”);
public Text evaluate(Text input){
Text output = new Text();
//validate
if (null ==input){
return null;
}
String inputDate = input.toString().trim();
if(null == inputDate){
return null;
}
try{
//parse
Date parseDate = inputFormat.parse(inputDate);
//tranform
String outputDate = outputFormat.format(parseDate);
//set
output.set(outputDate);
}catch(Exception e){
e.printStackTrace();
return output;
}
return output;
}
public static void main(String[] args){
System.out.println(new DateTransformUDF().evaluate(new Text(“31/Aug/2015:00:04:37 +0800”))); //输出测试
3/4.同上,导包
5. insert overwrite table 【子表文件名】 select my_removequotes(remote_addr), my_datetransform(my_removequotes(time_local)), my_removequotes(request), my_removequotes(http_referer) from 【原表文件名】;
6.同上,检测
六 编写HiveQL分析数据
筛选数据中的部分字段进行分析
【时间段】
示例:select substring(‘20150831230437’,9,2) hour from【子表文件名】;
(下标从1开始计算,例子中表示从第9位开始,取数2位)
eg:select t.hour, count() cnt from
(select substring(time_local,9,2) hour from【子表文件名】) t
group by t.hour order by cnt desc;
(得出一个hour统计数的递减表)
【ip地址】
eg:select t.prex_ip,count() cnt from
(select substring(27.38.5.159’,1,7) prex_ip from【子表文件名】) t
group by t.prex_ip order by cnt desc;
七 采用python脚本进行数据清洗和统计-MovieLens电影平台数据分析
1.文件字段解析
196 241 3 881250949
userid moveid rate time
2.创建子表u_data
eg:CREATE TABLE u_data (
userid INT,
moveid INT,
rating INT,
unixtime STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’
STORED AS TEXTFILE;
(创建之后输入【show tables;】检测u _data表是否存在)
3.将数据导入表中
LOAD DATA LOCAL INPATH ‘【数据文件路径】’ OVERWRITE INTO TABLE 【子表文件名】
eg:LOAD DATA LOCAL INPATH ‘/opt/datas/ml-100k/u.data’ OVERWRITE INTO TABLE u_data;
4.查看条数
select count() from u_data; //这里可以用count(1)代替count(),提高效率
5.创建python脚本
eg:touch weekday_mapper.py
vi weekday_mapper.py //编辑python脚本
import sys
import datetime
for line in sys.stdin:
line = line.strip()
userid,moveid,rating,unixtime = line.split(’\t’)
weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()
print ‘\t’.join([userid,moveid,rating,str(weekday)])
保存
6.创建新表u_data_new
eg:CREATE TABLE u_data_new(
userid INT,
moveid INT,
rating INT,
weekday INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’;
7.导入python包
add FILE /opt/datas/ml-100k/weekday_mapper.py;
8.插入数据
eg:INSERT OVERWRITE TABLE u_data_new
SELECT
TRANSFORM (userid, moveid, rating, unixtime)
USING ‘python weekday_mapper.py’
AS (userid, movieid, rating,weekday)
FROM u_data;
//查看观众喜欢在周几去观看电影
SELECT weekday, COUNT(1) cnt FROM u_data_new GROUP BY weekday order by cnt desc;
总结:hive用于数据清洗时,一般编写UDF或者python等脚本语言进行处理。
290

被折叠的 条评论
为什么被折叠?



