Spark SQL-将数组数组转换为单个数组

Spark SQL-将数组数组转换为单个数组,sql,apache-spark-sql,Sql,Apache Spark Sql,我有两列字符串数组 | ColA | ColB | |------|------| | ["a"]| ["b"]| 我想创建一个包含两个数组值的列“ 我尝试了array(ColA,ColB),结果是: | ColAplusBnested | |-----------------| | [["a"], ["b"]] | 如何获得所需的结果(数组转换为初始数组中的值数组)?假设您的数据如下: val df = spark.sqlContext.createDataFrame(Seq( (A

我有两列字符串数组

| ColA | ColB |
|------|------|
| ["a"]| ["b"]|
我想创建一个包含两个数组值的列“

我尝试了
array(ColA,ColB)
,结果是:

| ColAplusBnested |
|-----------------|
| [["a"], ["b"]]  |

如何获得所需的结果(数组转换为初始数组中的值数组)?

假设您的数据如下:

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]|
+----+----+
似乎没有数组(或序列)的连接函数。我只看到字符串的
concat
函数。但您可以创建一个简单的用户定义函数(UDF):

您想要执行的任何额外逻辑(例如排序、删除重复项)都可以在您的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]|
+---------+

搜索术语
flatten array/collection
。我不知道spark,但我相信它在没有自定义代码的情况下应该是可行的。我相信扁平化会将它减少到每行一个值,这并不完全是我要找的。
explode
可以做到这一点,但我不确定如何将所有值选回到一个数组中。我的意思是像
flant(数组(ColA,ColB))
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]|
+---------+
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]|
+---------+