2017-09-04 68 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

相關問題