2017-07-27 59 views
3

我有一個文件每行有一個JSON。下面是一個示例:與Python拼接的嵌套數據

{ 
    "product": { 
     "id": "abcdef", 
     "price": 19.99, 
     "specs": { 
      "voltage": "110v", 
      "color": "white" 
     } 
    }, 
    "user": "Daniel Severo" 
} 

我想創建一個如列的拼花文件:

product.id, product.price, product.specs.voltage, product.specs.color, user 

我知道,實木複合地板具有使用的Dremel算法嵌套的編碼,但我一直沒能夠在Python中使用它(不知道爲什麼)。

我是一個沉重的熊貓和DASK用戶,所以管道,我試圖構造是json data -> dask -> parquet -> pandas,雖然如果任何人有創建和使用Python在地板閱讀這些嵌套編碼的一個簡單的例子,我認爲這將足夠好:d

編輯

所以,在永久居民挖後,我發現這一點:https://github.com/dask/fastparquet/pull/177

這基本上是我想做的事情。儘管如此,我仍然無法完成這項工作。我如何告訴dask/fastparquet我的product列是嵌套的?

+1

fastparquet大概可以*讀取*如上所述的鑲木地板文件,但不能寫入它們。這是因爲熊貓數據框(目標結構)很少會看起來像這樣。您可以將架構自己扁平化爲熊貓數據框,並且可以在寫入時使用JSON(object_encoding = {'specs':'JSON'})編碼任何重複值(列表,字典)。 – mdurant

+0

(注意:MAP和LIST鑲木地板類型的書寫可以用於fastparquet,但在我看來,似乎比需求更合理) – mdurant

+0

做過類似的事情。我會很快在這裏發佈一個例子作爲答案。謝謝! –

回答

4

實現兩個讀的轉化率和對任意平面嵌套的數據寫入路徑是相當複雜的得到正確的 - 實施粉碎和重組算法,並將相關轉換轉換爲一些Python數據結構。我們在Arrow/parquet-cpp(參見https://github.com/apache/parquet-cpp/tree/master/src/parquet/arrow)的路線圖上有這個,但它尚未完成(現在只支持簡單的結構和列表/數組)。具有此功能非常重要,因爲使用Parquet的其他系統(如Impala,Hive,Presto,Drill和Spark)對其SQL方言中的嵌套類型提供本地支持,所以我們需要能夠忠實地讀寫這些結構來自Python。

這也可以在fastparquet中類似地實現,但是無論你如何分片,它都將需要大量的工作(並編寫測試用例)。

今年晚些時候,如果沒有人能夠勝任我的工作,我將很有可能會在此工作(在parquet-cpp),但我希望能有一些幫助。

+0

太棒了!我現在找到了一個解決方法(可能不是最聰明的方法)。我要用我的解決方案的一個工作示例創建一個.ipynb。我相信更多的人有這個問題。你有沒有關於如何在pyarrow中使用當前嵌套函數的例子? –

+0

@ wes-mckinney:如果有人想寫這樣的結構鑲木地板數據集,那麼你認爲輸入數據是什麼樣的?箭頭可以處理這種嵌套的東西,還是我們在說Python對象(字典)? – mdurant

+0

箭頭有本地列表(數組),結構,地圖等,因此您可以在編寫之前轉換爲箭頭嵌套數據(我們需要一些函數來簡化內置Python數據結構和箭頭數據之間的轉換) –