HIVE自定义UDF进行数据清理——IDEA

来源:互联网 发布:帝国全面战争海军数据 编辑:程序博客网 时间:2024/05/29 02:52

    • IDEA自定义UDF并使用
      • - 创建maven项目
      • - pomxml文件
      • - java代码
      • - 导出为jar
      • - 导出带依赖的jar包
      • - 在Hive命令行中执行
      • - 参考

IDEA自定义UDF并使用

GitHub源码地址

- 创建maven项目

  1. 创建一个maven项目,添加hadoop-client和hive-exec的maven依赖
  2. 相关依赖查询:http://mvnrepository.com/

- pom.xml文件

1.贴下我的pom.xml文件:

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>per.wanghai</groupId>    <artifactId>udf</artifactId>    <version>1.0-SNAPSHOT</version>    <properties>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>        <hadoop.version>2.7.4</hadoop.version>        <hive.version>2.1.1</hive.version>        <!--<maven.compiler.source>1.8</maven.compiler.source>-->        <!--<maven.compiler.target>1.8</maven.compiler.target>-->    </properties>    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->    <dependencies>        <dependency>            <groupId>org.apache.hadoop</groupId>            <artifactId>hadoop-client</artifactId>            <version>${hadoop.version}</version>        </dependency>        <dependency>            <groupId>org.apache.hive</groupId>            <artifactId>hive-exec</artifactId>            <version>${hive.version}</version>        </dependency>    </dependencies>    <build>        <plugins>            <!-- 编译插件 -->            <plugin>                <groupId>org.apache.maven.plugins</groupId>                <artifactId>maven-compiler-plugin</artifactId>                <version>3.7.0</version>                <configuration>                    <source>1.8</source>                    <target>1.8</target>                </configuration>            </plugin>            <!-- 打包 -->            <plugin>                <artifactId>maven-assembly-plugin</artifactId>                <version>2.6</version>  <!--最终好像应用的时2.2-beta-5? -->                <configuration>                    <descriptorRefs>                        <descriptorRef>jar-with-dependencies</descriptorRef>                    </descriptorRefs>                    <archive>                        <manifest>                            <!--运行jar包时运行的主类,要求类全名-->                            <mainClass>per.wanghai.RemoveQuotesUdf</mainClass>                        </manifest>                    </archive>                </configuration>                <executions>                    <execution>  <!-- 配置执行器 -->                        <id>make-assembly</id>                        <phase>package</phase>  <!-- 绑定到package生命周期阶段上 -->                        <goals>                            <goal>single</goal>  <!-- 只运行一次 -->                        </goals>                    </execution>                </executions>            </plugin>        </plugins>    </build></project>

2.编译时注意事项:(源jdk和目标jdk)(当然也可以直接在pom.xml中配置)

这里写图片描述

3.如果有的依赖下载失败,请检查下所需依赖的repository是否可从已经配置的maven仓库中下载到。没有对应的仓库:

  • maven的setting.xml配置对应的mirror
  • pom.xml中配置对应的repositorie

- java代码

示例代码(去除数据中的“”):

package per.wanghai;import org.apache.hadoop.hive.ql.exec.UDF;import org.apache.hadoop.io.Text;/** * @author 王海[https://github.com/AtTops] * @version V1.0 * @package per.wanghai * @Description * @Date:2017/10/20 9:28 */public class RemoveQuotesUdf extends UDF{    public Text evaluate(Text str){        if(null == str){            return null;        }        else if(null == str.toString()){            return null;        }            else {                return new Text(str.toString().replaceAll("\"",""));            }}    public static void main(String[] args) {        System.out.println(new RemoveQuotesUdf().evaluate(new Text("\"test_,\"666\"")));        //输出test_,666    }}

- 导出为jar:

  • 使用不带依赖的jar包应该照样可以执行,这里我尝试像Eclipse的“export”一样打不带依赖的包,以下为尝试步骤,最终失败(检查发现输出的jar下面没有class文件,还是原样的Java文件),希望知道正确方法的朋友能留言指点
  • 项目根目录处键入“F4”,选中Empty(可自定义需要打包的文件)(下方的选项会打包所有依赖包),然后在“Output Layout”中,把自己要打包的文件、文件夹添加进去。“+”中点击“File添加要打包的jar”,下方红框添加MANIFESET.MF文件

这里写图片描述

- 导出带依赖的jar包:

(会自动打包不带依赖的版本)
如果不带依赖的包无法正常执行:
Idea中把Maven项目的命令都做成了可视化的操作界面

  • 直接使用IDEA自带的Maven Projects工具打包(需要提前在pom.xml中配置maven插件)
  • (也可以使用IDEA自带的打包方式,不过感觉有些麻烦)
  • 点开MavenProjects,双击“package”或者“assembly:assembly”进行打包。如果失败,之后再打包时,可以先“clean”再打包。

这里写图片描述

输出target目录下的文件:红框中的jar文件,是带依赖包的文件
同样,这里我们用不带依赖的jar包就行(文件大小通常就几KB)
这里写图片描述

- 在Hive命令行中执行

  • add jar /你Linux机器的相应jar的对应位置(添加class path)
  • create temporary function 自定义方法名 as “主程序的全路径”
  • 这种方法添加的UDF是临时的,仅对当前session起作用

这里写图片描述

验证结果,所有的“”已经被清理
这里写图片描述

- 参考

Assembly官网
maven assembly 打包
mirror * 导致找不到包

原创粉丝点击