2 回答
TA贡献1830条经验 获得超9个赞
使用zipWithIndex
。
pyspark 与 Scala 不同。
其他答案对性能不利 - 使用单个执行器。zipWithIndex
是narrow transformation
这样,它可以按partition
.
在这里,您可以进行相应的定制:
from pyspark.sql.types import StructField
from pyspark.sql.types import StructType
from pyspark.sql.types import StringType, LongType
import pyspark.sql.functions as F
df1 = spark.createDataFrame([ ('abc'),('2'),('3'),('4'), ('abc'),('2'),('3'),('4'), ('abc'),('2'),('3'),('4') ], StringType())
schema = StructType(df1.schema.fields[:] + [StructField("index", LongType(), True)])
rdd = df1.rdd.zipWithIndex()
rdd1 = rdd.map(lambda row: tuple(row[0].asDict()[c] for c in schema.fieldNames()[:-1]) + (row[1],))
df1 = spark.createDataFrame(rdd1, schema)
df1.show()
返回:
+-----+-----+
|value|index|
+-----+-----+
| abc| 0|
| 2| 1|
| 3| 2|
| 4| 3|
| abc| 4|
| 2| 5|
| 3| 6|
| 4| 7|
| abc| 8|
| 2| 9|
| 3| 10|
| 4| 11|
+-----+-----+
TA贡献2021条经验 获得超8个赞
假设:这个答案基于以下假设: 的顺序col_id应取决于age列。如果假设不成立,则其他建议的解决方案是问题评论中提到的zipWithIndex。zipWithIndex可以在此答案中找到 的示例用法。
建议的解决方案:您可以使用window带有空partitionBy和行号的 a 来获取预期的数字。
from pyspark.sql.window import Window
from pyspark.sql import functions as F
windowSpec = Window.partitionBy().orderBy(F.col('age').asc())
age = age.withColumn(
'col_id',
F.row_number().over(windowSpec)
)
添加回答
举报