Saya mengajukan pertanyaan berikut di sini:

Dengan teks berikut:

Saya memiliki bingkai data seperti ini:

|customer_key|order_id|subtotal|address        |
------------------------------------------------
|12345       |O12356  |123.45  |123 Road Street|
|10986       |945764  |70.00   |634 Road Street|
|32576       |678366  |29.95   |369 Road Street|
|67896       |198266  |837.69  |785 Road Street|

Dan saya ingin menyusun ulang/mengganti nama kolom berdasarkan JSON berikut yang berisi nama kolom saat ini dan nama kolom yang diinginkan:

{
"customer_key": "cust_id",
"order_id": "transaction_id",
"address": "shipping_address",
"subtotal": "subtotal"
}

Untuk memiliki Dataframe yang dihasilkan:

|cust_id|transaction_id|shipping_address|subtotal|
--------------------------------------------------
|12345  |O12356        |123 Road Street |123.45  |
|10986  |945764        |634 Road Street |70.00   |
|32576  |678366        |369 Road Street |29.95   |
|67896  |198266        |785 Road Street |837.69  |

Apakah ini sesuatu yang mungkin? jika membuatnya lebih mudah, urutan kolom tidak penting.

Perbedaan utamanya adalah saya sekarang mencari cara untuk melakukan ini di pyspark alih-alih panda.

0
DBA108642 9 Januari 2020, 23:30

3 jawaban

Jawaban Terbaik

Gunakan pilih dengan alias:

select_expr = [col(c).alias(a) for c, a in mappings.items()]

df = df.select(*select_expr)
2
blackbishop 9 Januari 2020, 21:51

Anda dapat dengan mudah menggunakan yang berikut ini:

new_mapping = {
"customer_key": "cust_id",
"order_id": "transaction_id",
"address": "shipping_address",
"subtotal": "subtotal"
}

for key, value in new_mapping.items():
        df = df.withColumnRenamed(key, value)

# Re-order df
new_columns = [col_name for col_name in new_mapping.values()]
df = df.select(*new_columns)

Catatan: Sekarang urutannya bergantung pada kamus. Di Python 2 dictinaries tidak berurutan, jadi Anda harus menggunakan OrderedDict, di Python 3 dicts memiliki urutan dan menjaga urutan penyisipan.

1
ggeop 9 Januari 2020, 21:28

Anda dapat menggunakan metode toDF:

dct = {
"customer_key": "cust_id",
"order_id": "transaction_id",
"address": "shipping_address",
"subtotal": "subtotal"
}

df.toDF(*[dct[col] for col in df.columns])
0
Mykola Zotko 26 Desember 2020, 18:37