我正在尝试使用Hive UDF UDFRowSequence生成自动增量值,但它为前两个记录生成相同的ID。
+-------+----------+---+-------------------+
|rank_id| state| id| datetime|
+-------+----------+---+-------------------+
| 1|New Jersey| 10|2018-03-27 10:00:00|
| 1| Tamil| 25|2018-03-27 11:05:00|
| 2| TamilNa| 25|2018-03-27 11:15:00|
| 3| TamilNadu| 25|2018-03-27 11:25:00|
| 4| Gujarat| 30|2018-03-27 11:00:00|
+-------+----------+---+-------------------+
以下是我用于自动增量的代码。
package org.apache.hadoop.hive.contrib.udf;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.hive.ql.udf.UDFType;
import org.apache.hadoop.io.LongWritable;
/**
* UDFRowSequence.
*/
@Description(name = "row_sequence",
value = "_FUNC_() - Returns a generated row sequence number starting from 1")
@UDFType(deterministic = false, stateful = true)
public class UDFRowSequence extends UDF
{
private LongWritable result = new LongWritable();
public UDFRowSequence() {
result.set(0);
}
public LongWritable evaluate() {
result.set(result.get() + 1);
return result;
}
}
任何人都可以告诉我,我做错了是为前两个记录生成相同的ID。
答案 0 :(得分:0)
显然,你没有做错任何事。 但是,似乎没有这样的解决方案。
您获得重复数字的原因主要是因为您的评估发生在2个映射器中(如果您使用的是火花引擎,那么2个执行器)。并且,在每个执行程序中,UDF将从1开始序列。 因此,前两个记录的相同值只是偶然的。结果可能会有所不同,具体取决于使用多少映射器来运行查询。
您可以通过将执行程序的数量限制为1来实现您想要的目标。从火花的角度来看,我认为您可以使用repartition(1)
操作。
另外看看@ thread有一些有用的点。