#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. Это был хороший урок для меня. Производительность также выглядит хорошо. Пожалуйста, укажите любой другой простой (меньшие строки кода) способ.