让我们解释一下上下文:有人给了我从多个 .csv 文件中获取的多个镶木地板文件。我想阅读所有这些镶木地板文件并制作一个大数据集。为此,我使用 pyarrow.parquet 包。
所以,我有多个镶木地板文件(我们可以称它们为 file1.pq;file2.pq;file3.pq)。所有文件具有完全相同的结构:相同的列名和相同的列内容。但有时在一个文件中一列的所有行中,值相同且等于 NA。在这种特殊情况下,函数dataset = pq.ParquetDataset(file_list)
会因为物理类型改变而失败。
让我们做一个视觉例子:
| 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]))
在哪里:
file_list
包含所有镶木地板文件
list_have_to_change
是必须更改名称的列名列表的列表。在我们的示例中是[[],[C1],[]]
.
但是在to_parquet()
方法模式返回之后
BYTE_ARRAY for 1;
DOUBLE for 2;
BYTE_ARRAY for 3;
所以它改变了任何东西。
问题:当我保存到 parquet 文件时如何强制模式,或者如何将 pq.ParquetDataset(file_list) 与非连贯的物理类型一起使用?
希望我清楚,提前感谢您的帮助。