Anda tidak dapat menambahkan kolom arbitrer ke a DataFrame
di Spark. Kolom baru hanya dapat dibuat dengan menggunakan literal (tipe literal lainnya dijelaskan di Bagaimana cara menambahkan kolom konstan di Spark DataFrame? )
from pyspark.sql.functions import lit
df = sqlContext.createDataFrame(
[(1, "a", 23.0), (3, "B", -23.0)], ("x1", "x2", "x3"))
df_with_x4 = df.withColumn("x4", lit(0))
df_with_x4.show()
## +---+---+-----+---+
## | x1| x2| x3| x4|
## +---+---+-----+---+
## | 1| a| 23.0| 0|
## | 3| B|-23.0| 0|
## +---+---+-----+---+
mengubah kolom yang sudah ada:
from pyspark.sql.functions import exp
df_with_x5 = df_with_x4.withColumn("x5", exp("x3"))
df_with_x5.show()
## +---+---+-----+---+--------------------+
## | x1| x2| x3| x4| x5|
## +---+---+-----+---+--------------------+
## | 1| a| 23.0| 0| 9.744803446248903E9|
## | 3| B|-23.0| 0|1.026187963170189...|
## +---+---+-----+---+--------------------+
termasuk menggunakan join
:
from pyspark.sql.functions import exp
lookup = sqlContext.createDataFrame([(1, "foo"), (2, "bar")], ("k", "v"))
df_with_x6 = (df_with_x5
.join(lookup, col("x1") == col("k"), "leftouter")
.drop("k")
.withColumnRenamed("v", "x6"))
## +---+---+-----+---+--------------------+----+
## | x1| x2| x3| x4| x5| x6|
## +---+---+-----+---+--------------------+----+
## | 1| a| 23.0| 0| 9.744803446248903E9| foo|
## | 3| B|-23.0| 0|1.026187963170189...|null|
## +---+---+-----+---+--------------------+----+
atau dihasilkan dengan function / udf:
from pyspark.sql.functions import rand
df_with_x7 = df_with_x6.withColumn("x7", rand())
df_with_x7.show()
## +---+---+-----+---+--------------------+----+-------------------+
## | x1| x2| x3| x4| x5| x6| x7|
## +---+---+-----+---+--------------------+----+-------------------+
## | 1| a| 23.0| 0| 9.744803446248903E9| foo|0.41930610446846617|
## | 3| B|-23.0| 0|1.026187963170189...|null|0.37801881545497873|
## +---+---+-----+---+--------------------+----+-------------------+
Dari segi kinerja, fungsi built-in ( pyspark.sql.functions
), yang memetakan ke ekspresi Catalyst, biasanya lebih disukai daripada fungsi yang ditentukan pengguna Python.
Jika Anda ingin menambahkan konten RDD sewenang-wenang sebagai kolom, Anda bisa
Untuk menambahkan kolom menggunakan UDF:
sumber
Untuk Spark 2.0
sumber
df = df.select('*', (df.age + 10).alias('agePlusTen'))
Anda secara efektif menambahkan kolom arbitrer karena @ zero323 memperingatkan kami di atas tidak mungkin, kecuali ada yang salah dengan melakukan ini di Spark, di Pandas itu cara standar ..df.select('*', df.age + 10, df.age + 20)
Ada banyak cara untuk menambahkan kolom baru di pySpark.
Mari pertama-tama buat DataFrame sederhana.
Sekarang mari kita coba menggandakan nilai kolom dan menyimpannya di kolom baru. PFB beberapa pendekatan berbeda untuk mencapai hal yang sama.
Untuk lebih banyak contoh dan penjelasan tentang fungsi spark DataFrame, Anda dapat mengunjungi blog saya .
Saya harap ini membantu.
sumber
Anda dapat menentukan yang baru
udf
saat menambahkancolumn_name
:sumber
sumber
StringType()
.Saya ingin menawarkan contoh umum untuk kasus penggunaan yang sangat mirip:
Kasus Penggunaan: Saya memiliki csv yang terdiri dari:
Saya perlu melakukan beberapa transformasi dan csv akhir harus terlihat seperti ini
Saya perlu melakukan ini karena ini adalah skema yang ditentukan oleh beberapa model dan saya perlu data akhir saya agar dapat dioperasikan dengan SQL Massal Inserts dan hal-hal semacam itu.
begitu:
1) Saya membaca csv asli menggunakan spark.read dan menyebutnya "df".
2) Saya melakukan sesuatu pada data.
3) Saya menambahkan kolom nol menggunakan skrip ini:
Dengan cara ini, Anda dapat menyusun skema Anda setelah memuat csv (juga akan berfungsi untuk menyusun ulang kolom jika Anda harus melakukan ini untuk banyak tabel).
sumber
Cara termudah untuk menambahkan kolom adalah dengan menggunakan "withColumn". Karena dataframe dibuat menggunakan sqlContext, Anda harus menentukan skema atau secara default dapat tersedia di dataset. Jika skema ditentukan, beban kerja menjadi membosankan saat berubah setiap saat.
Di bawah ini adalah contoh yang bisa Anda pertimbangkan:
sumber
Kami dapat menambahkan kolom tambahan ke DataFrame secara langsung dengan langkah-langkah di bawah ini:
sumber