我們假設你的數據是這樣的:
val df = spark.sqlContext.createDataFrame(Seq(
(Array("a"), Array("b"))
)).toDF("ColA", "ColB")
df.printSchema()
df.show()
root
|-- ColA: array (nullable = true)
| |-- element: string (containsNull = true)
|-- ColB: array (nullable = true)
| |-- element: string (containsNull = true)
+----+----+
|ColA|ColB|
+----+----+
| [a]| [b]|
+----+----+
的existing set of Spark SQL functions沒有出現有陣列(或序列)級聯功能。我只看到concat
函數的字符串。但是你可以創建一個簡單的用戶定義函數(UDF):
import org.apache.spark.sql.functions.udf
val concatSeq = udf { (x: Seq[String], y: Seq[String]) => x ++ y }
val df2 = df.select(concatSeq('ColA, 'ColB).as("ColAplusB"))
df2.printSchema()
df2.show()
root
|-- ColAplusB: array (nullable = true)
| |-- element: string (containsNull = true)
+---------+
|ColAplusB|
+---------+
| [a, b]|
+---------+
要執行(例如排序,刪除重複),可以在你的UDF做任何額外的邏輯:
val df = spark.sqlContext.createDataFrame(Seq(
(Array("b", "a", "c"), Array("a", "b"))
)).toDF("ColA", "ColB")
df.show()
+---------+------+
| ColA| ColB|
+---------+------+
|[b, a, c]|[a, b]|
+---------+------+
val concatSeq = udf { (x: Seq[String], y: Seq[String]) =>
(x ++ y).distinct.sorted
}
df.select(concatSeq('ColA, 'ColB).as("ColAplusB")).show()
+---------+
|ColAplusB|
+---------+
|[a, b, c]|
+---------+
搜索長期'扁平數組/集合'。我不知道火花,但我相信它應該是可行的,沒有自定義代碼。 – lad2025
我相信扁平化會將其降低到每行單個值,這並不完全是我正在尋找的。 'explode'就是這樣做的,但是我不確定如何將所有值選回單個數組。 – 3yakuya
我的意思是像'flatten(array(ColA,ColB))' – lad2025