Выполнение случайных испытаний в pyspark

#pyspark #rdd #flatten

#pyspark #rdd #сгладить

Вопрос:

Я недавно изучаю pyspark и хотел применить одну из проблем. По сути, я хочу выполнять случайные испытания для каждой записи в фрейме данных.Мой фрейм данных структурирован, как показано ниже.

 order_id,order_date,distribution,quantity
O1,D1,3 4 4 5 6 7 8 ... ,10
O2,D2,1 6 9 10 12 16 18 ..., 20
O3,D3,7 12 15 16 18 20 ... ,50

 

Здесь столбец распределения — это 100 процентильных точек, где каждое значение разделено пробелом.

Я хочу перебрать каждую из этих строк в dataframe и случайным образом выбрать точку в распределении и добавить эти много дней в order_date и создать новый столбец arrival_date. В конце я хочу получить среднее значение (количество) по arrival_date. Итак, мой окончательный фрейм данных должен выглядеть так

 arrival_date,qty
A1,5
A2,10
 

То, чего я достиг до сих пор, приведено ниже

 df = spark.read.option("header",True).csv("/tmp/test.csv")

def randSample(row):
    order_id = row.order_id
    quantity = int(row.quantity)
    data = []
    for i in range(1,20):
        n = random.randint(0,99)
        randnum = int(float(row.edd.split(" ")[n]))
        arrival_date = datetime.datetime.strptime(row.order_date.split(" ")[0], "%Y-%m-%d")   datetime.timedelta(days=randnum)
        data.append((arrival_date, quantity))
    return data
        
finalRDD = df.rdd.map(randSample)
 

Вычисления выглядят корректно, однако finalRDD структурирован как список списков, как показано ниже

 [
[(),(),(),()]
,[(),(),(),()]
,[(),(),(),()]
,[(),(),(),()]
]
 

Каждый список внутри основного списка представляет собой одну запись . И каждый кортеж внутри вложенного списка является пробной версией этой записи.
По сути, я хочу, чтобы конечный результат был в виде сглаженных записей, чтобы я мог выполнить среднее значение.

 [
(),
(),
(),
] 
 

Комментарии:

1. Ну, я смог добиться этого, используя flatMap вместо map. Это был хороший урок для меня. Производительность также выглядит хорошо. Пожалуйста, укажите любой другой простой (меньшие строки кода) способ.