用两列创建一个元组 - PySpark

时间:2017-08-29 13:19:54

标签: python apache-spark zip pyspark

我的问题基于PySpark: Add a new column with a tuple created from columns中的类似问题,区别在于我有一个值列表而不是每列一个值。例如:

+---------------+---------------+--------------------+
|             v1|             v2|             v_tuple|
+---------------+---------------+--------------------+
|[2.0, 1.0, 9.0]|[9.0, 7.0, 2.0]|[(2.0,9.0), (1.0,...|
|[4.0, 8.0, 9.0]|[1.0, 1.0, 2.0]|[(4.0,1.0), (8.0,...|
+---------------+---------------+--------------------+

我想要得到的是像每行列表一样的拉链元素,但我不能在pyspark 1.6中找到它:

{{1}}

注意:数组的大小可能因行而异,但对于同一行列,它总是相同的。

1 个答案:

答案 0 :(得分:2)

如果数组的大小因行而异,则需要UDF:

from pyspark.sql.functions import udf

@udf("array<struct<_1:double,_2:double>>")
def zip_(xs, ys):
    return list(zip(xs, ys))

df.withColumn("v_tuple", zip_("v1", "v2"))

在Spark 1.6中:

from pyspark.sql.types import *

zip_ = udf(
    lambda xs, ys: list(zip(xs, ys)),
    ArrayType(StructType([StructField("_1", DoubleType()), StructField("_2", DoubleType())])))