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

Merging lists in a single pySpark 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

但我想不出办法。

我已经遍历了列表,我可以在每次迭代后追加这两列。 但是我发现很难找到一种方法来创建数据框并逐步填充它。

这是我的代码:

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

但它 returns 我这个:

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

有一种简单的方法可以使用 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)