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]|
+---------+