Hive 自动递增 UDF 没有给出预期的结果
Hive auto increment UDF doesn't give desired results
我正在尝试在 Hive
中创建一个 UDF
。此 UDF
必须自动递增名为 id
.
的 hive
table 列
下面是创建 UDF
.
的 Java
代码
package myudf;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.hive.ql.udf.UDFType;
@UDFType(deterministic = false, stateful = true)
public class autoincrement extends UDF{
int lastValue;
public int evaluate() {
lastValue++;
return lastValue;
}
}
现在我可以创建一个 jar 文件并将 jar 文件添加到配置单元中,如下所示:
add jar /home/cloudera/Desktop/increment.jar;
然后创建一个临时函数
create temporary function inc as 'myudf.autoincrement';
创建 table 如下所示。
Create table abc(id int, name string)
插入值:
INSERT into TABLE abc SELECT inc() as id, 'Tim';
执行select语句:
select * from abc;
输出:
1 Tim
插入值:
INSERT into TABLE abc SELECT inc() as id, 'John';
执行select语句:
select * from abc
输出:
1 Tim
1 John
但我所期待的是我第二次插入值。
我的预期输出是:
1 Tim
2 John
如何获得预期的输出。我应该在 Java
代码中更改什么以获得所需的结果?
我也可以在 Spark
中使用相同的功能吗
当我做的时候很兴奋
sqlContext.sql("show functions")
它显示了 Hive
中所有可用函数的列表
但是当我这样做时
sqlContext.sql("INSERT into TABLE abc SELECT inc() as id, 'Jim'")
我收到以下错误
pyspark.sql.utils.AnalysisException: u'undefined function inc; line 1 pos 29'
如何在 pyspark
中创建相同的 UDF
并获得所需的输出
insert语句同时执行会怎样?
按照以下步骤操作
- 将您的插入更改为 INSERT into TABLE abc SELECT max(id)+1 as id, 'Tim' from abc;
或
- 修改UDF,将int列作为输入,return输入+1
- 将您的插入修改为 INSERT into TABLE abc SELECT inc(max(id)) as id, 'Tim' from abc;
你必须在 hive 中尝试 SQL 的正确性,因为我已经检查过它在 MYSQL 中工作。
我正在尝试在 Hive
中创建一个 UDF
。此 UDF
必须自动递增名为 id
.
hive
table 列
下面是创建 UDF
.
Java
代码
package myudf;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.hive.ql.udf.UDFType;
@UDFType(deterministic = false, stateful = true)
public class autoincrement extends UDF{
int lastValue;
public int evaluate() {
lastValue++;
return lastValue;
}
}
现在我可以创建一个 jar 文件并将 jar 文件添加到配置单元中,如下所示:
add jar /home/cloudera/Desktop/increment.jar;
然后创建一个临时函数
create temporary function inc as 'myudf.autoincrement';
创建 table 如下所示。
Create table abc(id int, name string)
插入值:
INSERT into TABLE abc SELECT inc() as id, 'Tim';
执行select语句:
select * from abc;
输出:
1 Tim
插入值:
INSERT into TABLE abc SELECT inc() as id, 'John';
执行select语句:
select * from abc
输出:
1 Tim
1 John
但我所期待的是我第二次插入值。
我的预期输出是:
1 Tim
2 John
如何获得预期的输出。我应该在 Java
代码中更改什么以获得所需的结果?
我也可以在 Spark
中使用相同的功能吗
当我做的时候很兴奋
sqlContext.sql("show functions")
它显示了 Hive
但是当我这样做时
sqlContext.sql("INSERT into TABLE abc SELECT inc() as id, 'Jim'")
我收到以下错误
pyspark.sql.utils.AnalysisException: u'undefined function inc; line 1 pos 29'
如何在 pyspark
中创建相同的 UDF
并获得所需的输出
insert语句同时执行会怎样?
按照以下步骤操作
- 将您的插入更改为 INSERT into TABLE abc SELECT max(id)+1 as id, 'Tim' from abc;
或 - 修改UDF,将int列作为输入,return输入+1
- 将您的插入修改为 INSERT into TABLE abc SELECT inc(max(id)) as id, 'Tim' from abc;
你必须在 hive 中尝试 SQL 的正确性,因为我已经检查过它在 MYSQL 中工作。