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,但它仍然显示没有找到那个类。谁能说出它出了什么问题吗?
是的,使用像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:在[