我有一个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和一些自定义项。但我想知道是否有任何内置的高阶方法可以有效地做到这一点。
2条答案
按热度按时间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]]|
+------+------+----------------+
pieyvz9o2#
为了
Spark-2.3
或者在下面,我发现迭代器zip方法对于这个用例非常方便(在发布问题时我没有意识到)。我可以定义一个小的自定义项并用作
这给了我想要的结果。