Объединить несколько кадров данных, выведенных с помощью функции цикла FOR, в один кадр данных.

У меня есть функция цикла FOR, которая перебирает список таблиц и столбцов (zip), чтобы получить минимальное и максимальное значения. Вывод разделяется для каждой комбинации, а не для одного кадра данных/таблицы. Есть ли способ объединить результаты цикла FOR в один окончательный вывод внутри функции?

from pyspark.sql import functions as f

def minmax(tables, cols):
    for table, column in zip(tables, cols):
        minmax = spark.table(table).where(col(column).isNotNull()).select(f.lit(table).alias("table"), f.lit(column).alias("col"), min(col(column)).alias("min"), 
        max(col(column)).alias("max"))
        minmax.show()
tables = ["sales_123", "sales_REW"]
cols = ["costs", "price"]

minmax(tables, cols)

Выход из функции:

+---------+-----+---+---+
|    table|  col|min|max|
+---------+-----+---+---+
|sales_123|costs|  0|400|
+---------+-----+---+---+

+----------+-----+---+---+
|     table|  col|min|max|
+----------+-----+---+---+
|sales_REW |price|  0|400|
+----------+-----+---+---+

Желаемый результат:

+---------+-----+---+---+
|    table|  col|min|max|
+---------+-----+---+---+
|sales_123|costs|  0|400|
|sales_REW|price|  0|400|
+---------+-----+---+---+

person thecoder    schedule 05.05.2019    source источник


Ответы (1)


Поместите все кадры данных в список и выполните объединение после цикла for:

from functools import reduce
from pyspark.sql import functions as f
from pyspark.sql import DataFrame

def minmax(tables, cols):

    dfs = []        
    for table, column in zip(tables, cols):
        minmax = spark.table(table).where(col(column).isNotNull()).select(f.lit(table).alias("table"), f.lit(column).alias("col"), min(col(column)).alias("min"), max(col(column)).alias("max"))
        dfs.append(minmax)
    df = reduce(DataFrame.union, dfs)

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

person Shaido    schedule 05.05.2019
comment
@Shaido Как я могу подготовить таблицу и столбцы для тестирования кода? - person PIG; 05.05.2019
comment
@PIG: Если вы просто хотите протестировать это, вы можете просто создать список фреймов данных Spark (прочитать из csvs или создать некоторые из фреймов данных pandas: stackoverflow.com/questions/43751509/), а затем зациклиться на них. - person Shaido; 06.05.2019
comment
@Shaido Я пытаюсь передать minmax(df1, cols), где df1 - это мой фрейм данных искры, а cols = df1.columns, в нем говорится, что столбец не повторяется - person Abhi; 07.04.2021
comment
@Abhi: Если у вас есть только один кадр данных, вам не следует использовать решение, описанное выше. Однако то, что вы хотите сделать, будет сильно отличаться в зависимости от того, что вы на самом деле хотите сделать, например: stackoverflow.com/questions/60534796/ или stackoverflow.com/questions/45382329/ - person Shaido; 07.04.2021
comment
@Шайдо Да! Просто запустил df.select(*[f.mean(c).alias(c) for c in df.columns]). Можете ли вы помочь с процентилем, у меня есть столбец идентификатора (уникальный), столбец категории (5 различных значений), 5 числовых столбцов. Процентиль - 25%, 50%, 75%, 100% требуется для каждого числового столбца. Будет запущен цикл для 5 категорий - person Abhi; 07.04.2021