Как правильно зациклить и построить фрейм данных pyspark - PullRequest
0 голосов
/ 03 июля 2019

Я закончил с логикой для моего фрейма данных Pyspark и теперь должен применить разные входные данные и объединить результаты.

Мне интересно, есть ли какой-либо выигрыш в производительности для создания UDF и его многократного вызова, в отличие от циклического перебора значений, как показано ниже.

### res_schema definition ###

twr = []
twr.append((330,900,900,18900,1))
twr.append((480,900,1800,27000,2))
twr.append((660,900,3600,36000,4))
twr.append((1440,0,25200,43200,1))
twr.append((10080,0,86400,259200,1))

results = []

for tup in twr:
    I = tup[0]
    R = tup[1]
    SR = tup[2]
    SW = tup[3]
    NR = tup[4]

    res = spark.sql(
        """
        SELECT *, LAST_VALUE(offdate) OVER (
            PARTITION BY name
            ORDER BY CAST(ondate AS timestamp) 
            RANGE BETWEEN CURRENT ROW AND INTERVAL {0} MINUTES FOLLOWING
        ) AS ld, SUM(works) OVER (
            PARTITION BY name
            ORDER BY CAST(ondate AS timestamp) 
            RANGE BETWEEN CURRENT ROW AND INTERVAL {0} MINUTES FOLLOWING
        ) AS ws
         FROM lc
         """.format(I))

    for r in res:
        results.append(r)

    ### More logic ###

resdf = spark.createDataFrame(results, res_schema)

Моя дополнительная логика обширна, но все еще полностью поддерживает sql, поэтому я не уверен, что мое медленное выполнение связано с запросами или циклом for.

Ответы [ 2 ]

0 голосов
/ 04 июля 2019

Лучше избегать UDF для лучшей производительности, особенно в Pyspark, поскольку он будет порождать отдельный процесс Python.

Далее, если вы собираетесь получить значение столбца из Row'r', вы можете попробовать встроенные функции collect_list или collect_set .

0 голосов
/ 03 июля 2019

Я думаю, что не идеально конвертировать DF в List, а затем снова конвертировать в DF.Как и при конвертации DF в List, вы будете использовать преимущества pyspark, такие как обработка огромного объема данных и параллелизм.

Вы должны попытаться смоделировать вашу логику в терминах карты, фильтра, уменьшить функции на DF вместо создания списка и применения логики в списке.

...