有没有一种方法可以在 Apache Arrow 镶木地板文件中指定分区,而无需在文件路径中使用配置单元样式“=”?
Is there a way to specify partitioning in Apache Arrow parquet files without using the hive-style "=" in the file paths?
我正在开展一个项目,我需要使用 Apache Arrow 创建和分析 parquet 文件。我正在使用的环境不允许在文件路径中使用“=”,这是配置单元命名约定强制执行的,例如“年=2007”。有没有一种方法可以使用 Arrow 创建分区的 parquet 文件而不使用 hive 样式的文件命名约定?
目前 Arrow 支持“配置单元”和“目录”方案。正如您所提到的,配置单元方案是 column_name=value
。目前无法将 =
字符更改为不同的分隔符,但如果您想制作一个,这听起来像是一张不错的 JIRA 票。
目录方案将只对值进行编码,不需要使用 =
,因此这可能适合您。这是一个略有不同的方案,因为它不将列名存储为目录名的一部分。因此,您需要在读回数据时提供该列名称。
我不确定您使用的是 pyarrow 还是 C++-arrow。在 pyarrow 中,讨论了目录方案 here. There is also a pyarrow example 使用食谱中的目录方案编写数据集。
import pyarrow as pa
import pyarrow.dataset as ds
import numpy.random
data = pa.table({"day": numpy.random.randint(1, 31, size=100),
"month": numpy.random.randint(1, 12, size=100),
"year": [2000 + x // 10 for x in range(100)]})
# The directory scheme is the default if no flavor is specified
partitioning=ds.partitioning(pa.schema([("year", pa.int16())]))
ds.write_dataset(data, "./partitioned", format="parquet", partitioning=partitioning)
这将生成如下文件:
./partitioned/2000/part-0.parquet
./partitioned/2001/part-1.parquet
./partitioned/2002/part-2.parquet
./partitioned/2003/part-3.parquet
./partitioned/2004/part-4.parquet
./partitioned/2005/part-6.parquet
./partitioned/2006/part-5.parquet
./partitioned/2007/part-7.parquet
./partitioned/2008/part-8.parquet
./partitioned/2009/part-9.parquet
我正在开展一个项目,我需要使用 Apache Arrow 创建和分析 parquet 文件。我正在使用的环境不允许在文件路径中使用“=”,这是配置单元命名约定强制执行的,例如“年=2007”。有没有一种方法可以使用 Arrow 创建分区的 parquet 文件而不使用 hive 样式的文件命名约定?
目前 Arrow 支持“配置单元”和“目录”方案。正如您所提到的,配置单元方案是 column_name=value
。目前无法将 =
字符更改为不同的分隔符,但如果您想制作一个,这听起来像是一张不错的 JIRA 票。
目录方案将只对值进行编码,不需要使用 =
,因此这可能适合您。这是一个略有不同的方案,因为它不将列名存储为目录名的一部分。因此,您需要在读回数据时提供该列名称。
我不确定您使用的是 pyarrow 还是 C++-arrow。在 pyarrow 中,讨论了目录方案 here. There is also a pyarrow example 使用食谱中的目录方案编写数据集。
import pyarrow as pa
import pyarrow.dataset as ds
import numpy.random
data = pa.table({"day": numpy.random.randint(1, 31, size=100),
"month": numpy.random.randint(1, 12, size=100),
"year": [2000 + x // 10 for x in range(100)]})
# The directory scheme is the default if no flavor is specified
partitioning=ds.partitioning(pa.schema([("year", pa.int16())]))
ds.write_dataset(data, "./partitioned", format="parquet", partitioning=partitioning)
这将生成如下文件:
./partitioned/2000/part-0.parquet
./partitioned/2001/part-1.parquet
./partitioned/2002/part-2.parquet
./partitioned/2003/part-3.parquet
./partitioned/2004/part-4.parquet
./partitioned/2005/part-6.parquet
./partitioned/2006/part-5.parquet
./partitioned/2007/part-7.parquet
./partitioned/2008/part-8.parquet
./partitioned/2009/part-9.parquet