I have a pyspark issue where as
Я переставляю строки моего информационного кадра, меняя их ранг, и их новое назначение может зависеть от количества исходящих строк.Тем не менее, это количество исходящих строк может меняться по мере прохождения.
Вот пример.
+---+----+-------+
| ID|TYPE|ROW_NUM|
+---+----+-------+
| A| cat| 1|
| B| cat| 2|
| C| cat| 3|
| D| cat| 4|
| E| dog| 5|
| F| cat| 6|
| G| cat| 7|
| H| cat| 8|
| I| cat| 9|
| J| dog| 10|
+---+----+-------+
Если мы хотим реранкнуть этот кадр данных в зависимости от их типа (кошка или собака), но этот новый ранг также зависит от количества кошек и собак с рангом, меньшим по значению, чем его новый предложенный балл.
from pyspark.sql.types import StructType, StructField, IntegerType, DoubleType, StringType
import pyspark.sql.functions as f
temp_struct = StructType([
StructField('ID', StringType()),
StructField('TYPE', StringType()),
StructField('ROW_NUM', IntegerType()) # essentially the rank going in.
])
temp_df = spark.createDataFrame([
['A', 'cat', 1],
['B', 'cat', 2],
['C', 'cat', 3],
['D', 'cat', 4],
['E', 'dog', 5],
['F', 'cat', 6],
['G', 'cat', 7],
['H', 'cat', 8],
['I', 'cat', 9],
['J', 'dog', 10]
], temp_struct)
temp_df.show()
the_thing_i_am_looking_to_do = 0.01 # place holder
# where the the_thing_i_am_looking_to_do is the number of rows with a row_num <= my adjusted ADJUSTED_RANK.
temp_df.withColumn('ADJUSTED_RANK', f.when(f.col('TYPE') == 'dog',
f.col('ROW_NUM') * .2 + the_thing_i_am_looking_to_do)
.otherwise(f.col('ROW_NUM'))).show()
В моем случае не каждый тип == собака гарантированно будет изменен илискорректированы, так что я не буду знать число или строки, которые следуют за ним.
Я пытаюсь быть здесь эффективным и избегать зацикливания, но это оказывается чрезвычайно трудным, чтобы заставить это работать.
В конце, когда все наладится, я повторю это поновый ADJUSTED_RANK.