问题描述
我正在用Python编写,并且想使用PyArrow生成Parquet文件。
根据我的理解和the Implementation Status,C ++(Python)库已经实现了MAP类型。在the Data Types中,我还可以找到类型map_(key_type,item_type[,keys_sorted])
。
因此,我使用Python / PyArrow中的几种不同方法进行了测试。但是他们都失败了。
例如:
df = pd.DataFrame({
'col1': pd.Series([
[('key','aaaa'),('value','1111')],[('key','bbbb'),'2222')],]),'col2': pd.Series(['foo','bar'])
}
)
udt = pa.map_(pa.string(),pa.string())
schema = pa.schema([pa.field('col1',udt),pa.field('col2',pa.string())])
table = pa.Table.from_pandas(df,schema)
pq.write_table(table,FILE_NAME)
当我用parquet-tools cat rand_gen_test_map.parquet
读取文件时,得到了:
col1:
.key_value:
.key_value:
col2 = foo
col1:
.key_value:
.key_value:
col2 = bar
在我看来,地图值未正确输出(或丢失)。虽然架构是正确的:
message schema {
optional group col1 (MAP) {
repeated group key_value {
required binary key (UTF8);
optional binary value (UTF8);
}
}
optional binary col2 (UTF8);
}
总而言之,我有两个问题(全部在Python中):
-
我了解我们可以使用
STRUCT
来模仿地图结构。但是由于Parquet提供了MAP类型,所以我们仍然要使用它。如果无法生成MAP数据类型,那么提供MAP类型的原因是什么?
解决方法
编写地图类型时出现错误。这应该在pyarrow 2.0中解决(现在也支持阅读)