我可以创建一个以数据框为元素的数据框吗? (使用sqlContext的Pyspark)

时间:2017-09-04 19:48:44

标签: python apache-spark dataframe pyspark

我有15k小文件。处理完成后,每个文件生成三个数据帧对象:v,vT和e。我想将所有15k文件的所有三个数据帧存储到一个数据帧对象中(让我们称之为组合)并写入磁盘,以便下次我只读取一次而不是15k次。此外,我还可以将此组合转换为RDD,并将地图功能一次应用于15k记录。这将充分利用CPU。

但目前我的实现是将v,vT和e写入一个文件夹(每个文件夹每个文件。总共15k个文件夹)。在每个文件夹中,v,vT和e分别有三个文件夹。现在我必须每15k次读取所有文件(技术上我需要读取15k * 3 = 45k次)。当我对这些文件应用某些算法时,我只需使用 for 循环逐个应用算法。我知道不是很聪明

所以我提出了一个想法,即将15k文件的v,vT和e存储到一个名为combo的列表中,然后创建一个单独的数据帧combo_df。通过将combo_df转换为RDD,我可以使用map函数一次在所有15k上应用用户定义的函数。

每个文件的代码如下:

v = sqlContext.createDataFrame(uri, 
                                ['id', 'URI', 'flag'])
vT = sqlContext.createDataFrame(vertex, 
                               ['id', 'URI_ID_FK', 'Vertex_Type_URI_ID_FK'])
e = sqlContext.createDataFrame(edge, 
                                ['src', 'dst', 'Relation_Type_URI_ID_FK'])

uri,vertex和edge是从每个文件中提取的三个列表对象。

将15k文件的所有v,vT和e存储到单个列表组合

combo = [[v1, vT2, e3],...,[vN, vTN, eN]] (pseudo-code)

我想使用组合

创建数据框(combo_df)
combo_df = sqlContext.createDataFrame(combo, ['v', 'vT', 'e'])

此时,我收到了一个错误:

  

AssertionError:dataType应为DataType

我不知道如何解决这个问题。

2 个答案:

答案 0 :(得分:1)

  

我可以创建一个以数据框为元素的数据框吗?

你做不到。只需分别编写每个DataFrame

答案 1 :(得分:-1)

在我看来,您希望将三个数据帧分开,因为它们的结构。您不应该通过阅读每个文件来创建三个不同的数据框,而应该考虑只保留一个,并将列重新组织为嵌套数据框structType()。你最终会得到这样的架构:

    root
     |-- v: struct (nullable = false)
     |    |-- id: string (nullable = true)
     |    |-- URI: string (nullable = true)
     |    |-- flag: string (nullable = true)
     |-- vT: struct (nullable = false)
     |    |-- id: string (nullable = true)
     |    |-- URI_ID_FK: string (nullable = true)
     |    |-- Vertex_Type_URI_ID_FK: string (nullable = true)
     |-- e: struct (nullable = false)
     |    |-- src: string (nullable = true)
     |    |-- dst: string (nullable = true)
     |    |-- Relation_Type_URI_ID_FK: string (nullable = true)

它的功能是

from pyspark.sql.functions import struct