我有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
我不知道如何解决这个问题。
答案 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