目錄
使用
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)
這將產生與上述語句相同的輸出。