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

时间:2018-03-06 17:32:12

标签: python python-3.x parquet pyarrow

让我们解释一下背景: 有人给了我从多个.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;

所以它改变了什么。

问题:如何在保存到镶木地板文件时强制架构,或者如何使用非连贯物理类型的pq.ParquetDataset(file_list)?

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

0 个答案:

没有答案