我想在一个组中为每个组分配一个从0或1开始的唯一ID号,并使用pyspark为每个组递增1。
我之前使用pthon与python一起完成了这个命令:
df['id_num'] = (df
.groupby('column_name')
.grouper
.group_info[0])
输入和所需输出的玩具示例是:
输入
object |
---|
apple |
orange |
pear |
berry |
apple |
pear |
berry |
输出:
object | id |
---|---|
apple | 1 |
orange | 2 |
pear | 3 |
berry | 4 |
apple | 1 |
pear | 3 |
berry | 4 |
from pyspark.sql.functions import col, create_map, lit
from itertools import chain
values = [('apple',),('orange',),('pear',),('berry',),('apple',),('pear',),('berry',)]
df = sqlContext.createDataFrame(values,['object'])
df1 = df.distinct()
distinct_list = list(df1.select('object').toPandas()['object'])
dict_with_index = {distinct_list[i]:i+1 for i in range(len(distinct_list))}
mapping_expr = create_map([lit(x) for x in chain(*dict_with_index.items())])
df=df.withColumn("id", mapping_expr.getItem(col("object")))
df.show() | |
---|---|
object | id |
apple | 2 |
orange | 1 |
pear | 3 |
berry | 4 |
apple | 2 |
pear | 3 |
berry | 4 |
+------+---+
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。