PySpark Получите количество проходящих строк во время перемешивания / сортировки / ранжирования - PullRequest
0 голосов
/ 25 июня 2019

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.

...