Anda dapat menggunakan print(actual_df.explain())== Physical Plan ==
*Project [lower(name#0) AS name#5, lower(eye_color#1) AS eye_color#9]
+- Scan ExistingRDD[name#0,eye_color#1]3, print(actual_df.explain())== Physical Plan ==
*Project [lower(name#0) AS name#5, lower(eye_color#1) AS eye_color#9]
+- Scan ExistingRDD[name#0,eye_color#1]4 loop, atau daftar pemahaman untuk menerapkan fungsi PySpark ke beberapa kolom dalam DataFrame
Menggunakan iterator untuk menerapkan operasi yang sama pada banyak kolom sangat penting untuk mempertahankan basis kode DRY
Mari jelajahi berbagai cara untuk menggunakan huruf kecil semua kolom dalam DataFrame untuk mengilustrasikan konsep ini
Jika Anda menggunakan Scala API, lihat posting blog ini tentang melakukan operasi pada banyak kolom di Spark DataFrame dengan foldLeft
Huruf kecil semua kolom dengan print(actual_df.explain())== Physical Plan ==
*Project [lower(name#0) AS name#5, lower(eye_color#1) AS eye_color#9]
+- Scan ExistingRDD[name#0,eye_color#1]3
Mari impor fungsi print(actual_df.explain())== Physical Plan ==
*Project [lower(name#0) AS name#5, lower(eye_color#1) AS eye_color#9]
+- Scan ExistingRDD[name#0,eye_color#1]_3 dari print(actual_df.explain())== Physical Plan ==
*Project [lower(name#0) AS name#5, lower(eye_color#1) AS eye_color#9]
+- Scan ExistingRDD[name#0,eye_color#1]7 dan gunakan untuk huruf kecil semua kolom dalam DataFrame
[
("Jose", "BLUE"),
("lI", "BrOwN")
],
["name", "eye_color"]
)
actual_df = (reduce(
lambda memo_df, col_name: memo_df.withColumn(col_name, lower(col(col_name))),
source_df.columns,
source_df
))
print(actual_df.show())+----+---------+
|name|eye_color|
+----+---------+
|jose| blue|
| li| brown|
+----+---------+
Rencana fisik yang dihasilkan oleh kode ini terlihat efisien
*Project [lower(name#0) AS name#5, lower(eye_color#1) AS eye_color#9]
+- Scan ExistingRDD[name#0,eye_color#1]
Bukan rahasia lagi bahwa pengurangan bukanlah salah satu fungsi yang disukai dari Pythonistas. —
Mari kita lihat bagaimana kita dapat mencapai hasil yang sama dengan print(actual_df.explain())== Physical Plan ==
*Project [lower(name#0) AS name#5, lower(eye_color#1) AS eye_color#9]
+- Scan ExistingRDD[name#0,eye_color#1]4 loop
Huruf kecil semua kolom dengan loop for
Mari gunakan print(actual_df.explain())== Physical Plan ==
*Project [lower(name#0) AS name#5, lower(eye_color#1) AS eye_color#9]
+- Scan ExistingRDD[name#0,eye_color#1]_9 yang sama seperti sebelumnya dan bangun actual_df = source_df
for col_name in actual_df.columns:
actual_df = actual_df.withColumn(col_name, lower(col(col_name)))0 dengan print(actual_df.explain())== Physical Plan ==
*Project [lower(name#0) AS name#5, lower(eye_color#1) AS eye_color#9]
+- Scan ExistingRDD[name#0,eye_color#1]4 loop
for col_name in actual_df.columns:
actual_df = actual_df.withColumn(col_name, lower(col(col_name)))_
Kode ini agak jelek, tetapi Spark pintar dan menghasilkan rencana fisik yang sama
print(actual_df.explain())== Physical Plan ==*Project [lower(name#18) AS name#23, lower(eye_color#19) AS eye_color#27]
+- Scan ExistingRDD[name#18,eye_color#19]
Mari kita lihat bagaimana kita juga bisa menggunakan pemahaman daftar untuk menulis kode ini
Huruf kecil semua kolom dengan pemahaman daftar
Mari gunakan print(actual_df.explain())== Physical Plan ==
*Project [lower(name#0) AS name#5, lower(eye_color#1) AS eye_color#9]
+- Scan ExistingRDD[name#0,eye_color#1]_9 yang sama seperti sebelumnya dan huruf kecil semua kolom dengan pemahaman daftar yang sangat disukai oleh Pythonistas jauh dan luas
*[lower(col(col_name)).name(col_name) for col_name in source_df.columns]
)
Spark masih pintar dan menghasilkan rencana fisik yang sama
print(actual_df.explain())== Physical Plan ==*Project [lower(name#36) AS name#41, lower(eye_color#37) AS eye_color#42]
+- Scan ExistingRDD[name#36,eye_color#37]
Mari kita gabungkan dan lihat bagaimana solusi ini bekerja saat dijalankan di beberapa, tetapi tidak semua, kolom di DataFrame
Melakukan operasi pada subset kolom DataFrame
Mari kita tentukan fungsi actual_df = source_df
for col_name in actual_df.columns:
actual_df = actual_df.withColumn(col_name, lower(col(col_name)))_3 yang menghapus semua tanda seru dan tanda tanya dari kolom
removed_chars = ("!", "?")
regexp = "|".join('\{0}'.format(i) for i in removed_chars)
return regexp_replace(col_name, regexp, "")
Mari gunakan print(actual_df.explain())== Physical Plan ==
*Project [lower(name#0) AS name#5, lower(eye_color#1) AS eye_color#9]
+- Scan ExistingRDD[name#0,eye_color#1]3 untuk menerapkan fungsi actual_df = source_df
for col_name in actual_df.columns:
actual_df = actual_df.withColumn(col_name, lower(col(col_name)))3 ke dua kolom di DataFrame baru
[
("h!o!c!k!e!y", "rangers", "new york"),
("soccer", "??nacional!!", "medellin")
],
["sport", "team", "city"]
)
print(source_df.show())+-----------+------------+--------+
| sport| team| city|
+-----------+------------+--------+
|h!o!c!k!e!y| rangers|new york|
| soccer|??nacional!!|medellin|
+-----------+------------+--------+actual_df = (reduce(
lambda memo_df, col_name: memo_df.withColumn(col_name, remove_some_chars(col_name)),
["sport", "team"],
source_df
))
print(actual_df.show())+------+--------+--------+
| sport| team| city|
+------+--------+--------+
|hockey| rangers|new york|
|soccer|nacional|medellin|
+------+--------+--------+
Mari kita coba membangun actual_df = source_df
for col_name in actual_df.columns:
actual_df = actual_df.withColumn(col_name, lower(col(col_name)))_0 dengan loop print(actual_df.explain())== Physical Plan ==
*Project [lower(name#0) AS name#5, lower(eye_color#1) AS eye_color#9]
+- Scan ExistingRDD[name#0,eye_color#1]4
for col_name in ["sport", "team"]:
actual_df = actual_df.withColumn(col_name, remove_some_chars(col_name))
Loop print(actual_df.explain())== Physical Plan ==
*Project [lower(name#0) AS name#5, lower(eye_color#1) AS eye_color#9]
+- Scan ExistingRDD[name#0,eye_color#1]4 terlihat cukup bersih. Sekarang mari kita coba dengan pemahaman daftar
*[remove_some_chars(col_name).name(col_name) if col_name in ["sport", "team"] else col_name for col_name in source_df.columns]
)
Wow, pemahaman daftarnya sangat jelek untuk subset kolom 😿
print(actual_df.explain())== Physical Plan ==
*Project [lower(name#0) AS name#5, lower(eye_color#1) AS eye_color#9]
+- Scan ExistingRDD[name#0,eye_color#1]3, print(actual_df.explain())== Physical Plan ==
*Project [lower(name#0) AS name#5, lower(eye_color#1) AS eye_color#9]
+- Scan ExistingRDD[name#0,eye_color#1]4, dan pemahaman daftar semuanya menghasilkan rencana fisik yang sama seperti pada contoh sebelumnya, jadi setiap opsi memiliki performa yang sama saat dieksekusi
*Project [lower(name#0) AS name#5, lower(eye_color#1) AS eye_color#9]
+- Scan ExistingRDD[name#0,eye_color#1]0
Pendekatan apa yang harus Anda gunakan?
print(actual_df.explain())== Physical Plan ==
*Project [lower(name#0) AS name#5, lower(eye_color#1) AS eye_color#9]
+- Scan ExistingRDD[name#0,eye_color#1]4 loop tampaknya menghasilkan kode yang paling mudah dibaca. Pemahaman daftar dapat digunakan untuk operasi yang dilakukan pada semua kolom DataFrame, tetapi harus dihindari untuk operasi yang dilakukan pada subset kolom. Kode print(actual_df.explain())== Physical Plan ==
*Project [lower(name#0) AS name#5, lower(eye_color#1) AS eye_color#9]
+- Scan ExistingRDD[name#0,eye_color#1]3 juga cukup bersih, jadi itu juga merupakan alternatif yang layak
Sebaiknya tulis fungsi yang beroperasi pada satu kolom dan bungkus iterator dalam transformasi DataFrame terpisah sehingga kode dapat dengan mudah diterapkan ke beberapa kolom
Mari kita definisikan print(actual_df.explain())== Physical Plan ==
*Project [lower(name#18) AS name#23, lower(eye_color#19) AS eye_color#27]
+- Scan ExistingRDD[name#18,eye_color#19]_3 transformasi DataFrame yang menggunakan larik print(actual_df.explain())== Physical Plan ==
*Project [lower(name#18) AS name#23, lower(eye_color#19) AS eye_color#27]
+- Scan ExistingRDD[name#18,eye_color#19]4 sebagai argumen dan menerapkan actual_df = source_df
for col_name in actual_df.columns:
actual_df = actual_df.withColumn(col_name, lower(col(col_name)))3 ke setiap print(actual_df.explain())== Physical Plan ==
*Project [lower(name#18) AS name#23, lower(eye_color#19) AS eye_color#27]
+- Scan ExistingRDD[name#18,eye_color#19]6