首页 > 解决方案 > Parquet `write_table` 在写入输出文件时将数据类型的键引入数据

问题描述

将数据写入镶木地板文件时遇到问题。我尝试了不同的pyarrow版本(2.0 和 3.0),但结果看起来一样。

我的数据看起来如何的示例:

test_data = {
    'dogs': [
        {'dog': 'frankie'},
        {'dog': 'ricky'}
    ]
}

other_test_data = {
    'dogs': [
        {'dog': 'rory'},
        {'dog': 'marko'}
    ]
}

然后,我将它们重新格式化为如下所示:

dog_data = {
    'dogs': [
        [{
            'dog': 'frankie'
        }, {
            'dog': 'ricky'
        }],
        [{
            'dog': 'rory'
        }, {
            'dog': 'marko'
        }]
    ]
}

我定义了架构:

dog_fields = [
    pa.field('dog', pa.string(), nullable=True)
]

dog_schema = pa.schema([
        ('dogs', pa.list_(pa.struct(dog_fields)))
    ])

我使用以下方法将它们转换为 pyarrow.Table: pq_table = pa.Table.from_pydict(mapping=dog_data, schema=dog_schema)

最后,我写入一个文件: pq.write_table(pq_table, 'dog_data.parquet')

我在文件中看到的是这个,称为list和的附加键item

{
    "dogs": {
        "list": [{
            "item": {
                "dog": "frankie"
            }
        }, {
            "item": {
                "dog": "ricky"
            }
        }]
    }
}

谁能解释一下为什么将数据字段的类型添加为数据的键?

有办法解决吗?


编辑

这就是我使用listanditem字段获取数据的方式。我用 安装包brew install parquet-tools,然后运行:

parquet-tools cat --json dog_data.parquet

我选择像这样加载文件的原因是我想检查内容是什么。需求来自我在将数据从镶木地板文件加载到 BigQuery 时看到的损坏的架构。BigQuery 不了解数据的结构,并将架构解释如下:

在此处输入图像描述

烦人.list.item东西被添加在那里。

标签: google-bigqueryparquetpyarrow

解决方案


您如何获得带有附加列表/项目的字典?

据我所知,将您的数据转换为arrow.Table,将其保存到 parquet 并重新加载它会产生相同的结果:

table = pa.Table.from_pydict(mapping=dog_data, schema=dog_schema)
pq.write_table(table, 'dog_data.parquet')
loaded_table = pq.read_table('dog_data.parquet')

print(loaded_table.to_pydict() == dog_data)
>>> True
print (loaded_table.to_pydict())
>>> {'dogs': [[{'dog': 'frankie'}, {'dog': 'ricky'}], [{'dog': 'rory'}, {'dog': 'marko'}]]}

推荐阅读