在单个pySpark数据帧中合并列表

时间:2016-10-25 17:39:45

标签: python list pyspark spark-dataframe

我正在浏览pySpark 1.6.2文档,以便将我的数据合并到一个数据帧中。

我有一个包含19个项目的列表(listname:sizes):

[9, 78, 13, 3, 57, 60, 66, 32, 24, 1, 2, 15, 2, 2, 76, 79, 100, 73, 4]

和包含19个不同长度子列表的2D列表(listname:data):

[[a,b,c],[d,e,f,g,h,i,j].......[x,y,z,a,f]]

我正在尝试创建一个如下所示的数据框:

        name                   size
0     [a,b,c]                  9
1     [d,e,f,g,h,i,j]          78
2     ........                 ...
.     ........                 ...
.     ........                 ...
18    [x,y,z,a,f]              4

但我无法想办法做到这一点。

我已遍历列表,我可以在每次迭代后附加两列。 但我发现很难找到一种方法来创建一个Dataframe并逐步填充它。

这是我的代码:

schema = StructType([StructField("name", StringType(), True), StructField("size", IntegerType(), True)])
dataframe = sqlContext.createDataFrame([],schema)

for i in range(len(data)):
    sizes.append(len(data[i]))
    t = sqlContext.DataFrame([[data[i], sizes[i]]],
                         columns=['name', 'size'])
    dataframe = dataframe.append(t, ignore_index=True)

dataframe.show()

但它让我回答:

+----+----+
|name|size|
+----+----+
+----+----+

1 个答案:

答案 0 :(得分:1)

使用zip()函数可以轻松实现此目的。如果你这样做:

t = zip(data, sizes)

您将拥有一个元组列表,每对一个:

[(['a', 'b', 'c'], 9),
 (['d', 'e', 'f', 'g', 'h', 'i', 'j'], 78),
  ...
 (['x', 'y', 'z', 'a', 'f'], 4)]

现在您只需使用元组列表创建DataFrame:

dataframe = sqlContext.createDataFrame(t,schema)