【IDEA导入Hive源码编译并创建自定义UDF函数】

下载源码包

下载安装包对应的源码包。
本次使用 apache-hive-3.1.2-src.tar.gz 。

编译

解压在当前目录后进入,打开命令行窗口,执行:

mvn clean compile -Phadoop-2 -DskipTests

报错:

java.io.IOException: Cannot run program "bash" (in directory "D:\xxx\apache-hive-3.1.2-src\common"): CreateProcess error=2, 系统找不到指定的文件。

这是因为在Windows环境不能执行bash。那么需要能执行bash环境,有一个神器:Git
安装git后,打开Git Bash,即可在Windows系统中执行Linux命令了!
在源码包目录下 Git Bash Here,在git窗口中重新执行

mvn clean compile -Phadoop-2 -DskipTests

Two thousand years later…
在这里插入图片描述

使用IDEA打开

1.修改pom.xml文件

经过maven编译后,理论上需要用到的依赖都已经下载,但是IDEA打开后,仍然有少部分失败。
如 提示找不到在org.apache.directory.server依赖中找不到 org.apache.directory.client.ldap:ldap-client-api:0.1-SNAPSNOT

Could not find artifact org.apache.directory.client.ldap:ldap-client-api:pom:0.1-SNAPSHOT in alimaven

而hive-service模块pom.xml中已存在:

<dependency>
      <groupId>org.apache.directory.client.ldap</groupId>
      <artifactId>ldap-client-api</artifactId>
      <version>${apache-directory-clientapi.version}</version>
      <scope>test</scope>
    </dependency>

查看maven仓库中这个jar也存在。可以大胆的将org.apache.directory.server中找不到依赖的包排除掉:

    <dependency>
      <groupId>org.apache.directory.server</groupId>
      <artifactId>apacheds-server-integ</artifactId>
      <version>${apache-directory-server.version}</version>
      <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.apache.directory.client.ldap</groupId>
                <artifactId>ldap-client-api</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

同样,还有部分依赖是因为指定scope为test而导致。将 <scope>test</scope> 注释即可。
可以参考:https://www.cnblogs.com/huangguoming/p/15779441.html

2.Build

Build前设置一下heap内存,默认的700M在Build过程中容易OOM。
在这里插入图片描述

在这里插入图片描述

3.创建UDF函数并注册

在ql模块,org.apache.hadoop.hive.ql.udf 包下创建UDF类,注意packge
在这里插入图片描述
在org.apache.hadoop.hive.ql.exec.FunctionRegistry中注册刚才创建的 AddRandomUDF
在这里插入图片描述
此时。已经可以将这份源码包重新打包,同样在 Git Bash 中打包

mvn clean package -Phadoop-2 -DskipTests

打包后上传至服务器重新部署hive,或替换jar的方式,生效自定义UDF函数就能使用。不做演示。
加下来演示的是,在IDEA中启动Hive,并验证创建的函数。

4.添加配置文件

在cli中创建resousces目录,mark为Resources,并放入相关配置文件
core-site.xml
hive-site.xml
hive-site.xml
配置文件从hive云主机拷贝一份过来即可
在这里插入图片描述
忘了放入core-site.xml,则找不到hadoop相关配置会报错:

org.apache.hadoop.io.nativeio.NativeIO$POSIX.stat(Ljava/lang/String;)Lorg/apache/hadoop/io/nativeio/NativeIO$POSIX$Stat

注意 hive-site.xml 要额外加上 hive.metastore.uris 和 datanucleus.schema.autocreateall

	<property>
		<name>hive.metastore.uris</name>
		<value>thrift://ip:9083</value>   <!-- 配置hive 中metastore启动ip和端口-->
	</property>
	
    <property>
        <name>datanucleus.schema.autocreateall</name>
        <value>false</value>
    </property>
	<property>
 		 <name>hive.metastore.local</name>
  		 <value>true</value>
	</property>
5.云主机上hive保持meatastore启动监听
hive --service metastore -p 9083 &
6.添加VM参数

-Djline.WindowsTerminal.directConsole=false
在这里插入图片描述

7.启动

找到 CliDriver 这个类并启动。
在这里插入图片描述
验证创建的addrandom函数。
在这里插入图片描述

如果遇到报错 /tmp 权限不足
hdfs dfs -chmod 755 /tmp

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用自定义UDF函数的方式实现Hive中的CAST函数,需要按照以下步骤进行操作: 1. 创建一个自定义UDF函数类,该类需要继承Hive中的GenericUDF或者AbstractGenericUDF类。具体而言,如果你需要处理单个参数,则可以继承GenericUDF类,如果需要处理多个参数,则可以继承AbstractGenericUDF类。 2. 在类中实现evaluate()方法,该方法用于实现CAST函数的逻辑。该方法需要接收参数,并返回转换后的值。在方法中,你需要编写实现将传入参数转换成指定类型的代码。具体而言,你可以使用Java中的类型转换操作或者其他相关的转换函数来完成这个过程。 3. 将该类编译打包成jar文件,并上传到Hive的classpath中。 4. 在Hive中注册该自定义UDF函数。具体而言,你需要使用CREATE FUNCTION语句来创建函数,并指定函数的名称、参数类型、返回类型等信息。例如,以下是一个示例代码: ``` CREATE FUNCTION my_cast AS 'com.example.MyCastUDF' USING JAR 'path/to/my-cast-udf.jar'; ``` 5. 在Hive中使用该自定义UDF函数。具体而言,你需要在SELECT语句中调用该函数,并将需要转换的参数作为函数的参数传入。例如,以下是一个示例代码: ``` SELECT my_cast(column_name AS target_type) FROM table_name; ``` 注意,这里的column_name是需要转换的列名,target_type是需要转换成的目标类型。你需要根据具体的情况进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值