如何将每列的两个数组转换为sparkDataframe的一对?

ktca8awb  于 2021-05-29  发布在  Spark
关注(0)|答案(2)|浏览(332)

我有一个dataframe,它有两列数组值,如下所示

var ds = Seq((Array("a","b"),Array("1","2")),(Array("p","q"),Array("3","4")))
var df = ds.toDF("col1", "col2")

+------+------+
|  col1|  col2|
+------+------+
|[a, b]|[1, 2]|
|[p, q]|[3, 4]|
+------+------+

我想把它转换成一个像下面这样的成对数组

+------+------+---------------+
|  col1|  col2|           col3|
+------+------+---------------+
|[a, b]|[1, 2]|[[a, 1],[b, 2]]|
|[p, q]|[3, 4]|[[p, 3],[q, 4]]|
+------+------+---------------+

我想我可以使用struct和一些自定义项。但我想知道是否有任何内置的高阶方法可以有效地做到这一点。

58wvjzkj

58wvjzkj1#

Spark-2.4 使用 arrays_zip 功能。 Example: ```
df.show()

+------+------+

| col1| col2|

+------+------+

|[a, b]|[1, 2]|

|[p, q]|[3, 4]|

+------+------+

from pyspark.sql.functions import *
df.withColumn("col3",arrays_zip(col("col1"),col("col2"))).show()

+------+------+----------------+

| col1| col2| col3|

+------+------+----------------+

|[a, b]|[1, 2]|[[a, 1], [b, 2]]|

|[p, q]|[3, 4]|[[p, 3], [q, 4]]|

+------+------+----------------+

pieyvz9o

pieyvz9o2#

为了 Spark-2.3 或者在下面,我发现迭代器zip方法对于这个用例非常方便(在发布问题时我没有意识到)。我可以定义一个小的自定义项

val zip = udf((xs: Seq[String], ys: Seq[String]) => xs.zip(ys))

并用作

var out = df.withColumn("col3", zip(df("col1"), df("col2")))

这给了我想要的结果。

相关问题