Parquet with Python

时间:2017-07-27 04:01:41

标签: python json parquet dask

我有一个每行有一个JSON的文件。这是一个示例:

{
    "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

修改

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

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

3 个答案:

答案 0 :(得分:7)

在任意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中实现,但无论你如何分割它,它都会有很多工作(和要编写的测试用例)。

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

答案 1 :(得分:0)

这不是正确的答案,但可以提供帮助。

我们可以尝试将您的字典转换为pandas DataFrame,然后将其写入.parquet文件:

import pandas as pd
from fastparquet import write, ParquetFile

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

df_test = pd.DataFrame(d)
write('file_test.parquet', df_test)

这会引发错误:

ValueError: Can't infer object conversion type: 0                                   abcdef
1                                    19.99
2    {'voltage': '110v', 'color': 'white'}
Name: product, dtype: object

一个简单的解决方案是将product列转换为列表:

df_test['product'] = df_test['product'].apply(lambda x: [x])

# this should now works
write('file_test.parquet', df_test)

# and now compare the file with the initial DataFrame
ParquetFile('file_test.parquet').to_pandas().explode('product')
    index            product                                 user
0   id               abcdef                             Daniel Severo
1   price             19.99                             Daniel Severo
2   specs   {'voltage': '110v', 'color': 'white'}       Daniel Severo

答案 2 :(得分:0)

我相信箭头/ pyarrow 2.0.0中终于添加了此功能:

https://issues.apache.org/jira/browse/ARROW-1644

https://arrow.apache.org/docs/python/json.html