自动 - 增加pyspark数据帧列值

时间:2018-05-04 11:48:57

标签: python apache-spark pyspark user-defined-functions pyspark-sql

我正在尝试在数据框中生成一个额外的列,并根据全局值自动递增值。但是,所有行都使用相同的值生成,并且值不会递增。

这是代码

def autoIncrement():
    global rec
    if (rec == 0) : rec = 1 
    else : rec = rec + 1
    return int(rec)

rec=14

UDF

autoIncrementUDF = udf(autoIncrement,  IntegerType())


df1 = hiveContext.sql("select id,name,location,state,datetime,zipcode from demo.target")

df1.withColumn("id2", autoIncrementUDF()).show()

结果是df

+---+------+--------+----------+-------------------+-------+---+
| id|  name|location|     state|           datetime|zipcode|id2|
+---+------+--------+----------+-------------------+-------+---+
| 20|pankaj| Chennai| TamilNadu|2018-03-26 11:00:00|   NULL| 15|
| 10|geetha| Newyork|New Jersey|2018-03-27 10:00:00|   NULL| 15|
| 25| pawan| Chennai| TamilNadu|2018-03-27 11:25:00|   NULL| 15|
| 30|Manish| Gurgoan|   Gujarat|2018-03-27 11:00:00|   NULL| 15|
+---+------+--------+----------+-------------------+-------+---+

但我期待以下结果

+---+------+--------+----------+-------------------+-------+---+
| id|  name|location|     state|           datetime|zipcode|id2|
+---+------+--------+----------+-------------------+-------+---+
| 20|pankaj| Chennai| TamilNadu|2018-03-26 11:00:00|   NULL| 15|
| 10|geetha| Newyork|New Jersey|2018-03-27 10:00:00|   NULL| 16|
| 25| pawan| Chennai| TamilNadu|2018-03-27 11:25:00|   NULL| 17|
| 30|Manish| Gurgoan|   Gujarat|2018-03-27 11:00:00|   NULL| 18|
+---+------+--------+----------+-------------------+-------+---+

感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

全局变量与python进程有关。 UDF可以在某个集群中的不同工作者上并行执行,并且应该是确定性的。

您应该使用monotonically_increasing_id()模块中的pyspark.sql.functions功能。

检查docs for more info

你应该小心,因为这个功能是动态的而不是粘性的:

How do I add an persistent column of row ids to Spark DataFrame?