2017-09-04 31 views
2

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

但是目前我的实现是将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,顶点和边缘是三个列表对象从每个文件提取。

商店所有的V,VT和15K文件电子为使用组合

combo_df = sqlContext.createDataFrame(combo, ['v', 'vT', 'e']) 

此时一个列表组合

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

我想创建一个数据帧(combo_df)我得到一个错误:

AssertionError: dataType should be DataType

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

回答

1

Can I create a data frame that has data frame as its elements?

你不行。分别写每个DataFrame

+0

我有15K的文件。在这种情况下,我将不得不创建45k文件。这个文件非常小,像100kb到300kb。所以我需要找到一种方法将所有它们合并成一个数据框,意思是给我15k文件,我给你一个数据帧。 –

-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 
+0

非常感谢。这可能是一个解决方案。另一个问题是如何将所有15k文件的数据帧结合在一起,并一次应用地图功能。我想这样做的原因是,现在我基本上使用了一个for循环来循环它们。在这种情况下,CPU使用率非常低。令人惊讶的是,Spark客户端模式(驱动程序和单个处理器上的工作)比集群模式(驱动程序一个,工作者两个)快得多。我感到很困惑。 –

+0

如果迭代循环,则会丢失火花的分布式方面。您可以通过将父目录指定为路径而不是文件路径来读取一个设置中的所有文件。 – MaFF

相关问题