Spark- How to concatenate DataFrame columns



使用 concat()concat_ws() SQL函數,可以將一個或多個列連接到Spark DataFrame上的單個列中。在文本中,將學習如何使用這些函數,還可以使用原始SQL通過Scala示例來連接列。

Preparing Data & DataFrame

  val data = Seq(("James","A","Smith","2018","M",3000),
    ("Michael","Rose","Jones","2010","M",4000),
    ("Robert","K","Williams","2010","M",4000),
    ("Maria","Anne","Jones","2005","F",4000),
    ("Jen","Mary","Brown","2010","",-1)
  )

  val columns = Seq("fname","mname","lname","dob_year","gender","salary")
  import spark.sqlContext.implicits._
  val df = data.toDF(columns:_*)
  df.show(false)

注意,我們需要導入spark對象上的implicits,它是SparkSession的一個實例,以便在Seq集合上使用toDF(),並在輸出下面使用df.show()

+-------+-----+--------+--------+------+------+
|fname  |mname|lname   |dob_year|gender|salary|
+-------+-----+--------+--------+------+------+
|James  |A    |Smith   |2018    |M     |3000  |
|Michael|Rose |Jones   |2010    |M     |4000  |
|Robert |K    |Williams|2010    |M     |4000  |
|Maria  |Anne |Jones   |2005    |F     |4000  |
|Jen    |Mary |Brown   |2010    |      |-1    |
+-------+-----+--------+--------+------+------+

Using Concat() function to concatenate DataFrame columns

spark sql提供了concat()函數來連接二個或多個DataFrame的列,使其變為一列。

語法

concat(exprs: Columns*): Column

它還可以獲取不同整數類型的列,並將它們連接到單個列中。例如,它支持String,Int,Boolean和數據。

df.select(concat(col("fname"), lit(","), col("mname"), lit(","), col("lname")).as("FullName"))

該語句通過串聯以分隔符逗號分割的fname,mname,lname列來創建"FullName"列。要添加定界符,我們使用了lit()函數。這樣產生的輸出只有一個串聯的列。

+------------------+
|FullName          |
+------------------+
|James,A,Smith     |
|Michael,Rose,Jones|
|Robert,K,Williams |
|Maria,Anne,Jones  |
|Jen,Mary,Brown    |
+------------------+

在withColumn中使用Concat()函數

讓我們來看另一個在withColumn()上使用concat()函數的例子,這里我們將通過連接列名添加一個新的列FullName。

df.withColumn("FullName", concat(col("fname"), lit(","), col("mname"), lit(','),col("lname"))).show(false)

上面的代碼段還保留了各個名稱,如果不需要,可以使用下面的語句刪除它們。

  df.withColumn("FullName",concat(col("fname"),lit(','),
    col("mname"),lit(','),col("lname")))
    .drop("fname")
    .drop("mname")
    .drop("lname")
    .show(false)

輸出如下。

+--------+------+------+------------------+
|dob_year|gender|salary|FullName          |
+--------+------+------+------------------+
|2018    |M     |3000  |James,A,Smith     |
|2010    |M     |4000  |Michael,Rose,Jones|
|2010    |M     |4000  |Robert,K,Williams |
|2005    |F     |4000  |Maria,Anne,Jones  |
|2010    |      |-1    |Jen,Mary,Brown    |
+--------+------+------+------------------+

concat_ws()函數使用分隔符連接

concat_ws()函數可以輕松地在連接DataFrame列時添加分隔符。

語法

concat_ws(sep: String, exprs: Columns*): Colums

concat_ws()函數取第一個參數作為分隔符,來分隔需要連接的列。

  df.withColumn("FullName",concat_ws(",",col("fname"),col("mname"),col("lname")))
    .drop("fname")
    .drop("mname")
    .drop("lname")
      .show(false)

輸出結果如下。

+--------+------+------+------------------+
|dob_year|gender|salary|FullName          |
+--------+------+------+------------------+
|2018    |M     |3000  |James,A,Smith     |
|2010    |M     |4000  |Michael,Rose,Jones|
|2010    |M     |4000  |Robert,K,Williams |
|2005    |F     |4000  |Maria,Anne,Jones  |
|2010    |      |-1    |Jen,Mary,Brown    |
+--------+------+------+------------------+

使用原生SQL

如果你有SQL背景,spark SQL還提供了一種使用Raw SQL語法進行連接的方法。但是,為了使用此功能,需要使用df.createOrReplaceTempView("EMP")創建一個臨時視圖。該操作將創建一個臨時表"EMP"。

df.createOrReplaceTempView("EMP")
spark.sql("select CONCAT(fname, ' ', lanme, ' ', mname) as FullName from EMP").show(false)

我們同樣可以在原始SQL語句使用concat()函數

+------------------+
|FullName          |
+------------------+
|James Smith A     |
|Michael Jones Rose|
|Robert Williams K |
|Maria Jones Anne  |
|Jen Brown Mary    |
+------------------+

到目前為止,我們已經使用了concat()函數,現在讓我們看看另一種使用操作符||連接字符串的方法。

  spark.sql("select fname ||' '|| lname ||' '|| mname as FullName from EMP")
    .show(false)

這將產生與上述語句相同的輸出。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM