Bagaimana kita menggabungkan dua kolom di Apache Spark DataFrame? Apakah ada fungsi di Spark SQL yang dapat kita gunakan?
116
Bagaimana kita menggabungkan dua kolom di Apache Spark DataFrame? Apakah ada fungsi di Spark SQL yang dapat kita gunakan?
Dengan SQL mentah, Anda dapat menggunakan CONCAT
:
Dengan Python
df = sqlContext.createDataFrame([("foo", 1), ("bar", 2)], ("k", "v"))
df.registerTempTable("df")
sqlContext.sql("SELECT CONCAT(k, ' ', v) FROM df")
Di Scala
import sqlContext.implicits._
val df = sc.parallelize(Seq(("foo", 1), ("bar", 2))).toDF("k", "v")
df.registerTempTable("df")
sqlContext.sql("SELECT CONCAT(k, ' ', v) FROM df")
Sejak Spark 1.5.0 Anda dapat menggunakan concat
fungsi dengan DataFrame API:
Dengan Python:
from pyspark.sql.functions import concat, col, lit
df.select(concat(col("k"), lit(" "), col("v")))
Di Scala:
import org.apache.spark.sql.functions.{concat, lit}
df.select(concat($"k", lit(" "), $"v"))
Ada juga concat_ws
fungsi yang mengambil pemisah string sebagai argumen pertama.
Inilah cara Anda dapat melakukan penamaan khusus
import pyspark
from pyspark.sql import functions as sf
sc = pyspark.SparkContext()
sqlc = pyspark.SQLContext(sc)
df = sqlc.createDataFrame([('row11','row12'), ('row21','row22')], ['colname1', 'colname2'])
df.show()
memberi,
+--------+--------+
|colname1|colname2|
+--------+--------+
| row11| row12|
| row21| row22|
+--------+--------+
buat kolom baru dengan menggabungkan:
df = df.withColumn('joined_column',
sf.concat(sf.col('colname1'),sf.lit('_'), sf.col('colname2')))
df.show()
+--------+--------+-------------+
|colname1|colname2|joined_column|
+--------+--------+-------------+
| row11| row12| row11_row12|
| row21| row22| row21_row22|
+--------+--------+-------------+
lit
membuat kolom_
Salah satu opsi untuk menggabungkan kolom string di Spark Scala adalah menggunakan
concat
.Diperlukan untuk memeriksa nilai nol . Karena jika salah satu kolom adalah null, hasilnya akan menjadi null meskipun salah satu kolom lain memiliki informasi.
Menggunakan
concat
danwithColumn
:Menggunakan
concat
danselect
:Dengan kedua pendekatan Anda akan memiliki NEW_COLUMN yang nilainya merupakan rangkaian kolom: COL1 dan COL2 dari df asli Anda.
sumber
concat_ws
alih-alihconcat
, Anda dapat menghindari memeriksa NULL.Jika Anda ingin melakukannya menggunakan DF, Anda dapat menggunakan udf untuk menambahkan kolom baru berdasarkan kolom yang ada.
sumber
Dari Spark 2.3 ( SPARK-22771 ) Spark SQL mendukung operator penggabungan
||
.Sebagai contoh;
sumber
Berikut cara lain untuk melakukan ini untuk pyspark:
sumber
Berikut adalah saran jika Anda tidak mengetahui nomor atau nama kolom di Dataframe.
sumber
concat (* cols)
v1.5 dan lebih tinggi
Menggabungkan beberapa kolom input menjadi satu kolom. Fungsi ini bekerja dengan string, biner, dan kolom array yang kompatibel.
Misalnya:
new_df = df.select(concat(df.a, df.b, df.c))
concat_ws (sep, * cols)
v1.5 dan lebih tinggi
Mirip dengan
concat
tetapi menggunakan pemisah yang ditentukan.Misalnya:
new_df = df.select(concat_ws('-', df.col1, df.col2))
map_concat (* cols)
v2.4 dan lebih tinggi
Digunakan untuk menggabungkan peta, mengembalikan gabungan semua peta yang diberikan.
Misalnya:
new_df = df.select(map_concat("map1", "map2"))
Menggunakan operator string concat (
||
):v2.3 dan lebih tinggi
Misalnya:
df = spark.sql("select col_a || col_b || col_c as abc from table_x")
Referensi: Spark sql doc
sumber
Di Spark 2.3.0, Anda dapat melakukan:
sumber
Di Java, Anda dapat melakukan ini untuk menggabungkan beberapa kolom. Kode sampel adalah untuk memberi Anda skenario dan cara menggunakannya untuk pemahaman yang lebih baik.
Kode diatas concatenated col1, col2, col3 dipisahkan dengan "_" untuk membuat kolom dengan nama "concatenatedCol".
sumber
Apakah kita memiliki sintaks java yang sesuai dengan proses di bawah ini
sumber
Cara lain untuk melakukannya di pySpark menggunakan sqlContext ...
sumber
Memang, ada beberapa abstraksi bawaan yang bagus untuk Anda capai penggabungan tanpa perlu menerapkan fungsi khusus. Karena Anda menyebutkan Spark SQL, jadi saya menduga Anda mencoba meneruskannya sebagai perintah deklaratif melalui spark.sql (). Jika demikian, Anda dapat menyelesaikannya secara langsung dengan meneruskan perintah SQL seperti:
SELECT CONCAT(col1, '<delimiter>', col2, ...) AS concat_column_name FROM <table_name>;
Selain itu, dari Spark 2.3.0, Anda dapat menggunakan perintah sesuai dengan:
SELECT col1 || col2 AS concat_column_name FROM <table_name>;
Di mana, adalah pembatas pilihan Anda (bisa juga berupa ruang kosong) dan merupakan tabel sementara atau permanen yang Anda coba baca.
sumber
Kita juga dapat menggunakan SelectExpr dengan mudah. df1.selectExpr ("*", "upper (_2 || _3) as new")
sumber