hive大数据测试(时间数据清洗UDF打包到hive中调用自定义函数,hive表数据导出到本机)

发布时间 2023-10-13 20:38:37作者: 201812

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

3.资料:

Hive中UDF编程 - 简书 (jianshu.com)

Hive中UDF练习 - 简书 (jianshu.com)

Hive日志分析之数据清洗 - 简书 (jianshu.com)