google-bigquery - 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"
}
}]
}
}
谁能解释一下为什么将数据字段的类型添加为数据的键?
有办法解决吗?
编辑
这就是我使用list
anditem
字段获取数据的方式。我用 安装包brew install parquet-tools
,然后运行:
parquet-tools cat --json dog_data.parquet
我选择像这样加载文件的原因是我想检查内容是什么。需求来自我在将数据从镶木地板文件加载到 BigQuery 时看到的损坏的架构。BigQuery 不了解数据的结构,并将架构解释如下:
烦人.list
的.item
东西被添加在那里。
解决方案
您如何获得带有附加列表/项目的字典?
据我所知,将您的数据转换为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'}]]}
推荐阅读
- hyperledger-fabric - Hyperledger Fabric - 如果互联网不可用,合约实例化失败
- android - 接收方应用程序 - 处理意图过滤器 URI 的权限
- php - 如何根据提交的数据重定向到特定的 URL?
- python-3.x - 模块在没有明确指令的情况下重新加载和重置
- python - Python Jupyter Notebook 中不显示内联图
- github - 使用 GraphQL 突变删除 github 中的分支
- reactjs - 基于对象更新重新渲染组件
- html - 如何防止文本超出网格(居中)?
- azure - 在 Azure 门户中禁用 SMBv3
- react-native - 反应本机日期选择器不让我选择日期