Python 使用pyarrow.parquet ParquetDataset的模式有问题(如何强制使用特定模式)

Python 使用pyarrow.parquet ParquetDataset的模式有问题(如何强制使用特定模式),python,python-3.x,parquet,pyarrow,Python,Python 3.x,Parquet,Pyarrow,让我们解释一下上下文: 有人给了我从多个.csv文件中获取的多个拼花文件。我想阅读所有这些拼花地板文件并制作一个大数据集。为此,我使用pyarrow.parquet包 所以,我有多个拼花文件(我们可以称它们为file1.pq;file2.pq;file3.pq)。所有文件都具有完全相同的结构:相同的列名和相同的列内容。但有时在一个文件中一列的所有行中,该值都是相同的,并且从egal到NA。在这种特殊情况下,函数dataset=pq.ParquetDataset(文件列表)由于物理类型更改而失败

让我们解释一下上下文: 有人给了我从多个.csv文件中获取的多个拼花文件。我想阅读所有这些拼花地板文件并制作一个大数据集。为此,我使用pyarrow.parquet包

所以,我有多个拼花文件(我们可以称它们为file1.pq;file2.pq;file3.pq)。所有文件都具有完全相同的结构:相同的列名和相同的列内容。但有时在一个文件中一列的所有行中,该值都是相同的,并且从egal到NA。在这种特殊情况下,函数
dataset=pq.ParquetDataset(文件列表)
由于物理类型更改而失败

让我们制作一个可视示例:

| File1.csv              |
|-------------|-----|----|
| Column Name | C1  | C2 |
|-------------|-----|----|
| Row 1       | YES | 10 |
| Row 2       | NA  | 15 |
| Row 3       | NO  | 9  |

| File2.csv              |
|-------------|-----|----|
| Column Name | C1  | C2 |
|-------------|-----|----|
| Row 1       | NA  | 10 |
| Row 2       | NA  | 15 |
| Row 3       | NA  | 9  |

| File2.csv              |
|-------------|-----|----|
| Column Name | C1  | C2 |
|-------------|-----|----|
| Row 1       | YES | 10 |
| Row 2       | NA  | 15 |
| Row 3       | NO  | 9  |
转换为拼花地板后,我们有:

pq.ParquetFile("File1.pq").schema[1].physical_type = 'BYTE_ARRAY' --> good !
pq.ParquetFile("File1.pq").schema[2].physical_type = 'DOUBLE' --> good !

pq.ParquetFile("File2.pq").schema[1].physical_type = 'DOUBLE' --> BAD !
pq.ParquetFile("File2.pq").schema[2].physical_type = 'DOUBLE' --> good !

pq.ParquetFile("File3.pq").schema[1].physical_type = 'BYRE_ARRAY' --> good!
pq.ParquetFile("File3.pq").schema[2].physical_type = 'DOUBLE' --> good !
我尝试打开每个拼花地板文件,并使用以下内容修改柱类型:

for i in  np.arange(0,len(file_list)):

    if list_have_to_change[i] != []:

        df = pd.read_parquet(file_list[i])

        df[list_have_to_change[i]] = df[list_have_to_change[i]].astype(bytearray)

        df.to_parquet(COPIEPATH + "\\" + ntpath.basename(file_list[i]))

    else :

        shutil.move(file_list[i],COPIEPATH + "\\" + ntpath.basename(file_list[i]))
其中:

文件\u列表
包含所有拼花地板文件

list\u have\u to\u change
是列名列表的列表,列名必须更改。在我们的示例中,它是
[],[C1],][]

但是在
to_parquet()之后
methode模式返回

BYTE_ARRAY for 1;

DOUBLE for 2;

BYTE_ARRAY for 3;
所以这就是改变一切

问题:当我保存到拼花文件中时,如何强制模式,或者如何将pq.ParquetDataset(文件列表)与非一致的物理类型一起使用?


希望我很清楚,提前谢谢你的帮助

显然,您可以将元数据实例直接传递给
ParquetDataset
构造函数。它能帮助以正确的格式读取列吗?我对这个参数的理解是:ParquetDataset将检查传递的元数据是否与文件中包含的de Data的元数据相同。你怎么看?IDK;我只使用带有Spark的拼花地板,在那里你可以在你装载或存储东西的任何地方传递一个明确的模式;界面是不同的。