当前位置: 首页 > 知识库问答 >
问题:

无法在配置单元中添加UDF

宿衡虑
2023-03-14
package com.hadoopbook.hive;

import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

public class Strip extends UDF {
  private Text result = new Text();

  public Text evaluate(Text str) {
    if (str == null) {
      return null;
    }
    result.set(StringUtils.strip(str.toString()));
    return result;
  }

  public Text evaluate(Text str, String stripChars) {
    if (str == null) {
      return null;
    }
    result.set(StringUtils.strip(str.toString(), stripChars));
    return result;
  }
}
hduser@nb-VPCEH35EN:~/Hadoop-tutorial/hadoop-book-master/ch17-hive/src/main/java/com/hadoopbook/hive$ javac Strip.java 
hduser@nb-VPCEH35EN:~/Hadoop-tutorial/hadoop-book-master/ch17-hive/src/main/java/com/hadoopbook/hive$ jar cvf Strip.jar Strip Strip.class 
Strip : no such file or directory
added manifest
adding: Strip.class(in = 915) (out= 457)(deflated 50%)

我将geenrated jar文件添加到hdfs目录中,使用:

hduser@nb-VPCEH35EN:~/Hadoop-tutorial/hadoop-book-master/ch17-hive/src/main/java/com/hadoopbook/hive$ hadoop dfs -copyFromLocal /home/hduser/Hadoop-tutorial/hadoop-book-master/ch17-hive/src/main/java/com/hadoopbook/hive/Strip.jar /user/hduser/input

我尝试使用以下命令创建一个UDf:

hive> create function strip as 'com.hadoopbook.hive.Strip' using jar 'hdfs://localhost/user/hduser/input/Strip.jar';

但是我得到了如下错误:

hive> add jar hdfs://localhost/user/hduser/input/Strip.jar;
converting to local hdfs://localhost/user/hduser/input/Strip.jar
Added [/tmp/hduser_resources/Strip.jar] to class path
Added resources: [hdfs://localhost/user/hduser/input/Strip.jar]
hive> create temporary function strip as 'com.hadoopbook.hive.Strip';

jar文件被成功地创建并添加到Hive,但它仍然显示没有找到那个类。谁能说出它出了什么问题吗?

共有1个答案

鲜于煜祺
2023-03-14

是的,使用像eclipse这样的IDE很容易,然后从CLI生成jar。

从命令行创建jar文件必须遵循以下步骤:

首先在project dirch17-hive下创建project dirs:

[ch17-hive]$ mkdir bin lib traget
[ch17-hive]$ ls
bin  lib  src  target
[ch17-hive]$ cp /usr/lib/hive/lib/hive-exec.jar lib/.
[ch17-hive]$ cp /usr/lib/hadoop/hadoop-common.jar lib/.
[java]$ pwd
/home/cloudera/ch17-hive/src/main/java
[java]$ javac  -d ../../../bin -classpath ../../../lib/hive-exec.jar:../../../lib/hadoop-common.jar com/hadoopbook/hive/Strip.java 

将menifest文件创建为:

[ch17-hive]$ cat MENIFEST.MF 
Main-Class: com.hadoopbook.hive.Strip
Class-Path: lib/hadoop-common.jar  lib/hive-exec.jar

将jar创建为

[ch17-hive]$ jar cvfm target/strip.jar MENIFEST.MF -C bin .added manifest
adding: com/(in = 0) (out= 0)(stored 0%)
adding: com/hadoopbook/(in = 0) (out= 0)(stored 0%)
adding: com/hadoopbook/hive/(in = 0) (out= 0)(stored 0%)
adding: com/hadoopbook/hive/Strip.class(in = 915) (out= 456)(deflated 50%)

现在您的项目结构应该如下所示:

[ch17-hive]$ ls *
MENIFEST.MF

bin:
com

lib:
hadoop-common.jar  hive-exec.jar

src:
main

target:
strip.jar
hadoop fs -put /home/cloudera/ch17-hive/target/strip.jar /user/cloudera/.
hive> create function strip_new as 'com.hadoopbook.hive.Strip' using jar 'hdfs:/user/cloudera/strip.jar';
converting to local hdfs:/user/cloudera/strip.jar
Added [/tmp/05a13d23-8051-431f-a354-793abac66160_resources/strip.jar] to class path
Added resources: [hdfs:/user/cloudera/strip.jar]
OK
Time taken: 0.071 seconds
hive>
 类似资料:
  • 失败:执行错误,从org.apache.hadoop.hive.ql.exec.FunctionTask返回代码1。配置单元仓库是非本地的,但是/home/hduser/hadoop-tutorial/hadoop-book-master/ch17-hive/src/main/java/com/hadoopbook/Hive/strip.jar指定本地文件系统中的文件。非本地仓库上的资源应指定非本

  • 我正在HIVE中编写代码来创建一个由1300行和6列组成的表: 现在,我想添加另一列,它包含所有1300行的唯一值,值将是。max_count是我现有表中的一列。我怎么能做到?我试图通过以下代码更改表

  • 我使用的是Hive-1.2.1版本。我是Hive新手。 我在TABLE_2中添加了一列并显示空值。我想把日期部分从时间戳列到新创建的列。我尝试了以下查询: 这是正常的,但它在新创建的date_col中显示空值。我只想要date_col中的date。 表1有13列,表2有14列(13+DATE_COL)。 TIMESTAMP_COL:-字符串。 DATE_COL-字符串。 请告诉我如何解决这个问题。

  • 我想在IntelliJ中运行我的第一个程序,但我不能在添加配置部分截图中添加我的主类 确定按钮不起作用

  • 我正在Windows7主机上运行Hortonworks 2.2沙盒。我已经为虚拟机分配了2GB内存。每次尝试创建表时,都会出现以下错误: HCatClient在创建表时出错:{“语句”:“使用默认值;创建表kjdrg(bigint,bigint,bigint)注释“k”行格式分隔字段,以“,”;”终止,错误):“无法创建表:kjdrg”,“exec:{“stdout”:“stderr”:"15/0

  • 我在我的Ubuntu VM上安装了Hive和Hadoop。 当我在终端上启动时,我会得到以下信息: SLF4J:类路径包含多个SLF4J绑定。slf4j:在[jar:file:/opt/apache-hive-2.3.5-bin/lib/log4j-Slf4j-impl-2.6.2.jar!/org/slf4j/impl/staticloggerbinder.class]中找到绑定slf4j:在[