Gabungkan beberapa kerangka data yang dihasilkan melalui fungsi loop FOR menjadi satu kerangka data tunggal

Saya memiliki fungsi loop FOR yang mengulangi daftar tabel dan kolom (zip) untuk mendapatkan nilai minimum dan maksimum. Outputnya dipisahkan untuk setiap kombinasi, bukan satu kerangka data/tabel. Apakah ada cara untuk menggabungkan hasil perulangan FOR menjadi satu keluaran akhir dalam fungsi?

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)

Keluaran dari fungsi:

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

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

Keluaran yang Diinginkan:

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

person thecoder    schedule 05.05.2019    source sumber


Jawaban (1)


Masukkan semua kerangka data ke dalam daftar dan lakukan penggabungan setelah for-loop:

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)

Perhatikan bahwa urutan kolom harus sama untuk semua kerangka data yang terlibat (seperti yang terjadi di sini). Jika tidak, hal ini dapat menimbulkan hasil yang tidak diharapkan.

person Shaido    schedule 05.05.2019
comment
@Shaido Bagaimana cara menyiapkan tabel dan kolom untuk menguji kode? - person PIG; 05.05.2019
comment
@PIG: Jika Anda hanya ingin mengujinya, Anda cukup membuat daftar kerangka data Spark (baca dari csvs, atau buat beberapa dari kerangka data pandas: stackoverflow.com/questions/43751509/) lalu mengulanginya. - person Shaido; 06.05.2019
comment
@Shaido Saya mencoba meneruskan minmax(df1, cols) di mana df1 adalah kerangka data percikan saya & cols = df1.columns, katanya kolom tidak dapat diubah - person Abhi; 07.04.2021
comment
@Abhi: Jika Anda hanya memiliki satu kerangka data maka Anda sebaiknya tidak menggunakan solusi di atas. Namun, apa yang ingin Anda lakukan akan sangat berbeda tergantung pada apa yang sebenarnya ingin Anda lakukan, mungkin seperti: stackoverflow.com/questions/60534796/ atau stackoverflow.com/questions/45382329/ - person Shaido; 07.04.2021
comment
@Shaido Ya! Cukup jalankan df.select(*[f.mean(c).alias(c) for c in df.columns]). Bisakah Anda membantu dengan persentil, saya memiliki kolom ID (unik), kolom kategori (5 nilai berbeda), 5 kolom numerik. Persentil - 25%, 50%, 75%, 100% diperlukan untuk setiap kolom numerik. Akan menjalankan loop untuk 5 kategori - person Abhi; 07.04.2021