2017-07-27 68 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数据结构和箭头数据之间的转换) –