使用Python在Parquet中嵌套数据

Dan*_*ero 11 python json parquet dask

我有一个文件,每行有一个JSON.这是一个示例:

{
    "product": {
        "id": "abcdef",
        "price": 19.99,
        "specs": {
            "voltage": "110v",
            "color": "white"
        }
    },
    "user": "Daniel Severo"
}
Run Code Online (Sandbox Code Playgroud)

我想用以下列创建一个镶木地板文件:

product.id, product.price, product.specs.voltage, product.specs.color, user
Run Code Online (Sandbox Code Playgroud)

我知道镶木地板使用Dremel算法进行嵌套编码,但我无法在python中使用它(不知道为什么).

我是一个沉重的熊猫和dask用户,所以我试图构建的管道是json data -> dask -> parquet -> pandas,虽然如果有人有一个简单的例子,使用Python在镶木地板中创建和读取这些嵌套编码我认为这样就足够了:D

编辑

所以,在挖掘PR之后我发现了这个:https://github.com/dask/fastparquet/pull/177

这基本上就是我想要做的.虽然,我仍然无法让它一直运作.我怎么告诉dask/fastparquet我的product列是嵌套的?

Wes*_*ney 9

在任意Parquet嵌套数据的读取和写入路径上实现转换都非常复杂 - 实现碎片和重组算法以及与某些Python数据结构相关联的转换.我们在Arrow/parquet-cpp的路线图中有这个(参见https://github.com/apache/parquet-cpp/tree/master/src/parquet/arrow),但尚未完成(仅支持现在支持简单的结构和列表/数组).具有此功能非常重要,因为使用Parquet的其他系统(如Impala,Hive,Presto,Drill和Spark)在其SQL方言中对嵌套类型具有本机支持,因此我们需要能够忠实地读取和写入这些结构来自Python.

这也可以类似地在fastparquet中实现,但无论你如何切片,它都会有很多工作(和编写的测试用例).

如果没有人打败我,我今年晚些时候可能会亲自接受这项工作(在镶木地板上),但我很想得到一些帮助.

  • @WesMcKinney 这已经完成了吗? (7认同)
  • 还在等待一些开发帮助.我希望它能在今年完成(即2018年),但不确定何时完成 (5认同)
  • 真棒!我现在找到了一种解决方法(可能不是最聪明的方法).我将用我的解决方案的一个工作示例创建一个.ipynb.我相信更多的人会遇到这个问题.你有任何关于如何使用`pyarrow`当前嵌套功能的例子吗? (2认同)
  • 根据下面的链接,截至 2020 年 2 月 23 日尚未实施,但计划于 2020 年实施。https://lists.apache.org/thread.html/r831c41a3f9b353cfc187dc2092515fe707d4ebf13cbb727524f1c600%40%3Cdev.arrow.apache.org%3E https ://issues.apache.org/jira/browse/ARROW-1644?src=confmacro (2认同)