![](/img/trans.png)
[英]spark merge datasets based on the same input of one column and concat the others
[英]How to concat one column records in spark?
我有2列,並且想將兩者都連接起來,下面是一小組數據:
ID Comments
32412 CLOSE AS NORMAL
32412 UNDER REVIEW
我希望它如下,所以基本上視圖是按ID分組並連接注釋。
ID Comments
32412 CLOSE AS NORMAL
UNDER REVIEW
另一種無需使用SQL查詢的方式:
import scala.collection.mutable
val myUDF = udf[String, mutable.WrappedArray[String]](_.mkString(" "))
df.groupBy($"id")
.agg(collect_list("comments").as("comments"))
.withColumn("comments", myUDF($"comments"))
.show()
它也需要HiveContext
作為SQLContext
。
您可以為此使用UDF(用戶定義的函數)。 假設您有一個名為df
的DataFrame
數據,則可以嘗試如下操作:
import scala.collection.mutable
sqlContext.udf.register("ArrayToString",(a: mutable.WrappedArray[String]) => a.mkString("\n"))
df.registerTempTable("IDsAndComments")
val new_df = sqlContext.sql("WITH Data AS (SELECT ID, collect_list(Comments) AS cmnts FROM IDsAndComments GROUP BY ID) SELECT ID, ArrayToString(cmnts) AS Comments FROM Data")
此處發生的是,您為sqlContext
定義了一個新函數,以便在解析SQL代碼時使用。 此函數采用WrappedArray
(這是您從Spark的DataFrames獲得的數組的類型),並將其轉換為字符串,在該字符串中,數組的每個元素都由新行分隔。
collect_list
是一個函數,它返回其分組的值的數組。 請注意,這是一個HiveContext
函數,因此您需要sqlContext
才能成為HiveContext
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.