2017-08-29 8 views
1

私の問題は、類似の質問PySpark: Add a new column with a tuple created from columnsに基づいていますが、1つの列に1つの値ではなく値のリストがあります。 2つの列からタプルを作成する - PySpark

+---------------+---------------+--------------------+ 
|    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,...| 
+---------------+---------------+--------------------+ 
注:私は取得しようとしています何

from pyspark.sql import Row 
df = sqlContext.createDataFrame([Row(v1=[u'2.0', u'1.0', u'9.0'], v2=[u'9.0', u'7.0', u'2.0']),Row(v1=[u'4.0', u'8.0', u'9.0'], v2=[u'1.0', u'1.0', u'2.0'])]) 

    +---------------+---------------+ 
    |    v1|    v2| 
    +---------------+---------------+ 
    |[2.0, 1.0, 9.0]|[9.0, 7.0, 2.0]| 
    |[2.0, 1.0, 9.0]|[9.0, 7.0, 2.0]| 
    +---------------+---------------+ 

はジップ要素単位行あたりのリストのような似たようですが、私はpyspark 1.6でそれを把握カント:たとえば、配列のサイズは行ごとに異なる場合がありますが、列ごとに同じ行では常に同じです。

答えて

3

配列のサイズはあなたが必要とUDFます行ごとに変化する場合:スパーク1.6で

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")) 

を:

from pyspark.sql.types import * 

zip_ = udf(
    lambda xs, ys: list(zip(xs, ys)), 
    ArrayType(StructType([StructField("_1", DoubleType()), StructField("_2", DoubleType())]))) 
関連する問題