Pyspark: разделить столбец строки Spark Dataframe и l oop список строк, чтобы найти соответствующую строку в несколько столбцов - PullRequest
0 голосов
/ 10 января 2020

Данные, с которыми я встречаюсь, выглядят так:

req_id dsp_price_style

0   "1000:10,1001:100,1002:5,1003:7" 
1   "1002:5,1000:100,1001:15,1003:6" 

формат значения поля 'dsp_price_style': dsp_id_0: price_0, dsp_id_1: price_1, .... ., dsp_id_n: price_n, пока они не отсортированы между dsp_id, мне нужны только данные с dsp_id '1000' и dsp_id '1001' и его ценой, и добавьте эти 4 данные в виде нового столбца с помощью pyspark.

req_id dsp_0 price_0 dsp_1 price_1

0     "1000"     "10"     "1001"    "100"   
1     "1000"    "100"     "1001"     "15"   

Как реализовать эту функцию с максимальной производительностью в pyspark?

1 Ответ

0 голосов
/ 10 января 2020

У меня есть подход здесь.

data = [
    [0,"1000:10,1001:100,1002:5,1003:7"],
    [1,"1002:5,1000:100,1001:15,1003:6"]
]

data_sdf = spark.createDataFrame(data, ['req_id', 'dsp_price_style'])

# the function to split
def split_dsp_price(row):
    ls_x = row.dsp_price_style.split(sep=',')
    return [row.req_id] + reduce(lambda x, y: x + y, [k.split(sep=':') for k in ls_x if k[:4] in ['1000', '1001']])

fnl_data_rdd = data_sdf.rdd.map(lambda r: split_dsp_price(r))

fnl_data_rdd.take(2)

# [[0, '1000', '10', '1001', '100'], [1, '1000', '100', '1001', '15']]

Это может быть далее преобразовано в DataFrame или подвергнуто дальнейшей обработке.

...