提问者:小点点

pyarrow parquet-将数组编码到记录列表中


我正在使用Pandas和pyarrow创建拼花文件,然后使用Java(org. apache.parque.avro.AvroParquetReader)读取这些文件的模式。

我发现使用熊猫pyarrow创建的parquet文件总是使用具有单个字段的记录数组对原始类型的数组进行编码。

我在使用PySpark时观察到相同的行为。这里有类似的问题Spark编写Parquet数组

这是创建拼花文件的python脚本:

import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq


df = pd.DataFrame(
  {
    'organizationId' : ['org1', 'org2', 'org3'],
    'entityType' : ['customer', 'customer', 'customer'],
    'entityId' : ['cust_1', 'cust_2', 'cust_3'],
    'customerProducts' : [['p1', 'p2'], ['p4', 'p5'], ['p1', 'p3']]
  }
)

table = pa.Table.from_pandas(df)
pq.write_table(table, 'output.parquet')

当我尝试读取该镶木地板文件的Avro模式时,我看到“客户产品”字段的以下模式:

{"type":"array","items":{"type":"record","name":"list","fields":[{"name":"item","type":["null","string"],"default":null}]}}

但我期待这样的事情:

{"type":"array","type":["null","string"],"default":null}]}}

任何人都知道是否有一种方法可以确保创建的带有原始类型数组的parquet文件具有最简单的模式?

谢谢


共1个答案

匿名用户

据我所知,镶木地板数据模型遵循电容器数据模型,它允许列是三种类型之一:

  1. 必填
  2. 可选
  3. 重复。

为了表示列表,需要嵌套类型来添加额外的间接级别,以区分空列表和仅包含空值的列表。