在Apache Arrow中,category
数据类型用于表示具有有限数量不同值的列,这些值通常是小型的且重复出现的。使用 category
类型可以显著减少内存使用,并提高某些操作的性能。
category
类型是一种特殊的字符串类型,它将所有唯一的字符串值存储在一个单独的“字典”中,并在每行数据中存储一个指向该字典中值的索引。这样,即使列中有大量重复的值,也只需要存储一次每个唯一的值。
category
数据类型在PyArrow中,你可以使用 pa.schema
来定义一个包含 category
类型的表结构,或者在创建表后使用 cast
方法将列转换为 category
类型。
import pyarrow as pa
import pyarrow.parquet as pq
# 创建一个简单的DataFrame
data = {
'fruit': ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
}
df = pa.Table.from_pydict(data)
# 定义一个新的schema,将'fruit'列设置为category类型
schema = pa.schema([
('fruit', pa.string()),
])
# 将DataFrame转换为使用新schema的Table,并将'fruit'列转换为category类型
table = df.cast(schema, safe=False)
table = table.set_column(0, 'fruit', pa.cast(table.column('fruit'), pa.category()))
# 查看转换后的Table信息
print(table.schema)
category
类型可以显著减少内存占用。category
类型上更高效地执行。category
可以节省大量内存。如果你在尝试将列转换为 category
类型时遇到问题,可能是因为以下原因:
safe=True
:这会导致无法转换的值引发异常。使用 safe=False
可以忽略无法转换的值。# 使用safe=False忽略无法转换的值
table = table.set_column(0, 'fruit', pa.cast(table.column('fruit'), pa.category(), safe=False))
通过这种方式,你可以有效地管理和优化包含重复字符串值的列,从而提高数据处理和分析的效率。
领取专属 10元无门槛券
手把手带您无忧上云