原始数据8条:
"1" "A" "R" 32 "H" "w" "2017-01-16" 1167 80 0 0 0 1200 0
"2" "A" "E" 67 "L" "b" "2016-06-12" 2488 50 1 1 3 4000 1
"3" "A" "E" 32 "H" "w" "2016-07-13" 2122 98 0 0 1 1500 1
"4" "A" "E" 82 "H" "w" "2016-01-20" 2993 115 0 0 0 3200 1
"5" "A" "s" 22 "R" "b" "2016-08-31" 484 69 0 1 3 800 0
"6" "b" "H" 92 "H" "w" "2016-02-04" 1634 81 0 0 1 3400 1
"7" "A" "E" 76 "H" "w" "2016-06-14" 1127 92 0 0 0 6000 1
"8" "A" "R" 82 "r" "w" "2016-05-30" 196 146 1 3 4 2300 0
处理后的结果数据:
2 ['A','E'] 67 ['L','B'] 2016-06-12 2488 50 {1,1,3} 4000 1
3 ['A','E'] 32 ['H','W'] 2016-07-13 2122 98 {0,0,1} 1500 1
4 ['A','E'] 82 ['H','W'] 2016-01-20 2993 115 {0,0,0} 3200 1
5 ['A','S'] 22 ['R','B'] 2016-08-31 484 69 {0,1,3} 800 0
6 ['B','H'] 92 ['H','W'] 2016-02-04 1634 81 {0,0,1} 3400 1
7 ['A','E'] 76 ['H','W'] 2016-06-14 1127 92 {0,0,0} 6000 1
8 ['A','R'] 82 ['R','W'] 2016-05-30 196 146 {1,3,4} 2300 0
原数据说明:
原数据总共8行14列,列与列之间的分隔符是\t键。
第1和7列的双引号去掉,且第7列的时间大于2017-01-01时,整行数据将被过滤掉。
第2、3、5、6列的双引号变成单引号,小写变大写,第2、3列组成字符数组,第5、6列组成字符数组。
第10、11、12列用"{}"括起来。
组成后的每一列之间用" "分割。
项目要求:
1.将Hive外部表加载原始数据到Hive表(用location 指定数据所在目录)
2.使用UDF函数对原始表数据做过滤,过滤结果如上结果数据。
3.将结果数据添加到新的hive表保存!
注意:
(1):制作Word文档,要求记录操作流程,结果截图,保存结果数据及UDF函数类。
(2):Word文档以"1809"班月考机试——+你的名字”命名。
特别强调:
1).以自己的名字命名文件夹、以自己的名字命名文件夹、以自己的名字命名文件夹。
2).如果使用UDF函数,只要对应的类及相关的类,不要Java工程、不要Java工程、不要Java工程。
过程:
1建表
2编辑原数据
vi /root/mytest.txt,内容如下
3导入数据
4写一个类
package hadooptest;
import org.apache.hadoop.hive.ql.exec.UDF;
public class MyTest extends UDF
{
public String evaluate(String str)
{
String[] strs = str.split("\t");
String str3 = "";
String newLine="";
for (int i = 0; i <= strs.length-1; i++) {
if(i == 0) {
newLine=newLine+strs[0].charAt(1)+" ";
}else if(i == 1||i==4) {
newLine=newLine+"['"+(""+strs[i].charAt(1)).toUpperCase()+"','";
}else if(i == 2|| i==5){
newLine=newLine+(""+strs[i].charAt(1)).toUpperCase()+"'] ";
}else if(i == 6) {
strs[6]=strs[6].substring(1,11);
String[] ss=strs[6].split("-");
if(Integer.parseInt(ss[0])>=2017)
{
return "";
}
newLine=newLine+strs[6]+" ";
}
if(i == 9)
{
newLine=newLine+"{"+strs[9]+",";
}
else if(i == 10)
{
newLine=newLine+strs[10]+",";
}
else if(i == 11)
{
newLine=newLine+strs[11]+"} ";
}else if(i == 3 || i == 7 || i == 8 || i == 12 )
{
newLine=newLine+strs[i]+" ";
}
else if(i==13)
newLine=newLine+strs[i];
}
return newLine;
}
}
5打包,得到
改名为
将这个jar包移动到linux de /root目录下
6在hive中添加这个jar包
7在hive中创建函数
8使用方法
9查看结果