蜂巢UDF';org.apache.hadoop.hive.contrib.udf.UDFRowSequence';为前两条记录生成相同的值

蜂巢UDF';org.apache.hadoop.hive.contrib.udf.UDFRowSequence';为前两条记录生成相同的值,hive,user-defined-functions,pyspark-sql,Hive,User Defined Functions,Pyspark Sql,我试图使用配置单元UDF UDFRowSequence生成自动增量值,但它为前两条记录生成相同的id +-------+----------+---+-------------------+ |rank_id| state| id| datetime| +-------+----------+---+-------------------+ | 1|New Jersey| 10|2018-03-27 10:00:00| | 1| Tamil

我试图使用配置单元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时做错了什么。

显然,你没有做错什么。
+-------+----------+---+-------------------+
|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|
+-------+----------+---+-------------------+
但是,似乎不存在这样的解决办法

之所以会得到重复的数字,主要是因为您的评估是在两个映射器中进行的(如果您使用的是spark engine,则是两个执行器)。并且,在每个执行器处,UDF将从1开始序列。 所以,前两条记录的相同值只是偶然的。根据用于运行查询的映射器的数量,结果可能会有所不同

您可以通过将执行者的数量限制为1来实现您想要的。从spark的角度来看,我认为您可以使用
重新分区(1)
操作

还可以看看这个,它有一些有用的要点