我在spark数据帧中有两ArrayType(StringType())
列,并且我想按元素方式将这两列连接起来:
输入:
+---------+---------+
|col1 |col2 |
+---------+---------+
|['a','b']|['c','d']|
+---------+---------+
输出:
+---------+---------+------------+
|col1 |col2 |col3 |
+---------+---------+------------+
|['a','b']|['c','d']|['ac', 'bd']|
+---------+---------+------------+
谢谢。
对于Spark 2.4+,您可以使用transform
函数,如下所示:
transform
col3_expr = "transform(col1, (x, i) -> concat(x, col2[i]))"
df.withColumn("col3", expr(col3_expr)).show()
函数将第一数组列transform
作为参数,对其元素进行迭代,并应用lambda函数col1
,其中(x, i) -> concat(x, col2[i])
是实际元素,而x
是用于从中获取相应元素的索引数组i
。
给予:
col2
或更高级的+------+------+--------+
| col1| col2| col3|
+------+------+--------+
|[a, b]|[c, d]|[ac, bd]|
+------+------+--------+
函数更简单:
zip_with
它并不会真正扩展,但是您可以在每个数组中获得zip_with
和df.withColumn("col3", expr("zip_with(col1, col2, (x, y) -> concat(x, y))"))
条目,然后说0th
是1st
,然后是col3
。将所有4个条目设置为单独的值,然后将它们组合输出。
这里是一个通用答案。只需查看结果即可。 2个相等大小的数组,因此两个元素均为n个元素。
a[0] + b[0]
返回:
a[1] + b[1]