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中也会导入该数据表