大数据清洗
hive大数据测试(时间数据清洗UDF打包到hive中调用自定义函数,hive表数据导出到本机)
1.数据清洗
pom依赖:
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<hadoop.version>3.3.0</hadoop.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>0.13.1</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>0.13.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
1.1编写UDF
package hiveUDF;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class DateTransform extends UDF {
private final SimpleDateFormat inputFormat = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss", Locale.ENGLISH);
private final SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public Text evaluate(Text input){
//过滤
if(input == null){
return null;
}
Text output = new Text();
String inputDate = input.toString();
try{
Date parseDate = inputFormat.parse(inputDate);
String outputDate = outputFormat.format(parseDate);
output.set(outputDate);
} catch (ParseException e) {
e.printStackTrace();
return null;
}
return output;
}
}
1.2在test中(相同包结构)测试是否成功清洗数据
package hiveUDF;
import org.apache.hadoop.io.Text;
public class DateTransformTest {
public static void main(String[] args) {
System.out.println(new DateTransform().evaluate(new Text("10/Nov/2016:00:01:02 +0800")));
}
}
测试结果是目的结果
1.3打包成jar包
方法一:直接在这里输出mvn clean package

方法二:点clean 然后package

1.4 上传到hive中
jar先上传到虚拟机中,接着在hive中输入:(node3)
add jar jar包的位置
然后输入
create temporary function 函数名字自起 as '方法所在的位置'
例如:
create temporary function datetransform as 'hiveUDF.DateTransform'

然后再在hive里面调用测试一下
datetransform("10/Nov/2016:00:01:02 +0800")
如果输出2016-11-10 00:01:02说明调用成功了
1.5执行清洗并且将清洗后的输入存入data_chage表中
create table data_chage
as
select
ip,
datetransform(d_time) as d_time,
day,traffic,type,id
from data;
2.将hive中的数据表数据导出到本机
2.1导出到Linux虚拟机本机
insert overwrite local directory '目录路径' select * from 表
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 以','作为分隔
例如:将数据库classtest04下的表top_traffic导出到 /export/data/hiveoutdata/classtest04,且用","进行分隔的语句
insert overwrite local directory '/export/data/hiveoutdata/classtest04' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' select * from classtest04.top_traffic;
2.2导出到本地
从虚拟机上直接下载该数据表即可,然后就可以用可视化SQL打开
同步虚拟机的sql后只需要在可视化SQL中导入该数据表,虚拟机中的sql中也会导入该数据表


浙公网安备 33010602011771号