Dataframe PySpark-从UDF获取行的索引

Dataframe PySpark-从UDF获取行的索引,dataframe,pyspark,user-defined-functions,row-number,Dataframe,Pyspark,User Defined Functions,Row Number,我有一个数据框,我需要获取特定行的行号/索引。我想添加一个新行,以便它包括字母以及行号/索引,例如“a-1”、“B-2” 有输出 +------+---------+ |Letter|distances| +------+---------+ | A| 20| | B| 30| | D| 80| +------+---------+ 我希望新推出的产品是这样的 +------+---------------+ |Letter|dist

我有一个数据框,我需要获取特定行的行号/索引。我想添加一个新行,以便它包括字母以及行号/索引,例如“a-1”、“B-2”

有输出

+------+---------+
|Letter|distances|
+------+---------+
|     A|       20|
|     B|       30|
|     D|       80|
+------+---------+
我希望新推出的产品是这样的

+------+---------------+
|Letter|distances|index|
+------+---------------+
|     A|       20|A - 1|
|     B|       30|B - 2|
|     D|       80|D - 3|
+------+---------------+
这是我一直在做的一个函数

def cate(letter):
    return letter + " - " + #index
a.withColumn("index", cate(a["Letter"])).show()
这应该行得通

df = spark.createDataFrame([("A", 20), ("B", 30), ("D", 80)],["Letter", "distances"])
df.createOrReplaceTempView("df")

spark.sql("select concat(Letter,' - ',row_number() over (order by Letter)) as num, * from df").show()

+-----+------+---------+                                                        
|  num|Letter|distances|
+-----+------+---------+
|A - 1|     A|       20|
|B - 2|     B|       30|
|D - 3|     D|       80|
+-----+------+---------+
这应该行得通

df = spark.createDataFrame([("A", 20), ("B", 30), ("D", 80)],["Letter", "distances"])
df.createOrReplaceTempView("df")

spark.sql("select concat(Letter,' - ',row_number() over (order by Letter)) as num, * from df").show()

+-----+------+---------+                                                        
|  num|Letter|distances|
+-----+------+---------+
|A - 1|     A|       20|
|B - 2|     B|       30|
|D - 3|     D|       80|
+-----+------+---------+

既然您希望使用UDF(仅限)实现结果,那么让我们试试这个

从pyspark.sql.functions导入udf,单调递增\u id
从pyspark.sql.types导入StringType
#样本数据
a=sqlContext.createDataFrame([(“a”,20),(“B”,30),(“D”,80)],[“字母”,“距离])
def类别(字母,idx):
回信+“-”+str(idx)
cate_udf=udf(cate,StringType())
a=a.withColumn(“临时索引”,单调递增的id())
a=a\
带列(“索引”,cate_udf(a.Letter,a.temp_index))\
下降(“临时指数”)
a、 show()
输出为:

+------+---------+--------------+
|Letter|distances|         index|
+------+---------+--------------+
|     A|       20|         A - 0|
|     B|       30|B - 8589934592|
|     D|       80|D - 8589934593|
+------+---------+--------------+

既然您希望使用UDF(仅限)实现结果,那么让我们试试这个

从pyspark.sql.functions导入udf,单调递增\u id
从pyspark.sql.types导入StringType
#样本数据
a=sqlContext.createDataFrame([(“a”,20),(“B”,30),(“D”,80)],[“字母”,“距离])
def类别(字母,idx):
回信+“-”+str(idx)
cate_udf=udf(cate,StringType())
a=a.withColumn(“临时索引”,单调递增的id())
a=a\
带列(“索引”,cate_udf(a.Letter,a.temp_index))\
下降(“临时指数”)
a、 show()
输出为:

+------+---------+--------------+
|Letter|distances|         index|
+------+---------+--------------+
|     A|       20|         A - 0|
|     B|       30|B - 8589934592|
|     D|       80|D - 8589934593|
+------+---------+--------------+

也许你能帮忙?(创建id,然后将行id作为参数传递给您的函数
cate
)或许可以帮助您?(创建id,然后将行id作为参数传递给函数
cate
)这是一个很好的解决方案,但是我必须为pyspark使用UDF。这是一个很好的解决方案,但是我必须为pyspark使用UDF。单调地增加\u id()不会给出从给定值开始的序列,相反,它给出了一个随机序列。@Bala-是的,没错。。。但它是递增的,所以对于OP的用例,我认为它可以用作顺序索引。单调递增的\u id()不会给出从给定值开始的序列,而是给出一个随机序列。@Bala-是的。。。但它正在增加,所以对于OP的用例,我认为它可以用作顺序索引。