HOWTO · Python

Python에서 Parquet 파일 읽기 및 쓰기

이 문서에서는 pyarrow 및 fastparquet의 두 가지 인터페이스를 사용하여 Python에서 parquet 파일을 읽고 쓰는 방법을 설명합니다. 읽기 표, 여러 열 및 단일 열과 같은 하위 섹션에 관련 코딩 예제가 제공됩니다.

이 기사는 Python에서 Parquet 파일을 작성하고 읽는 방법에 중점을 둡니다. 이러한 유형의 파일은 데이터를 열 단위로 저장하는 스토리지 시스템 형식입니다.

Parquet는 CSV와 같은 행 기반 파일 형식에 비해 성능이 최적화된 파일 형식입니다. Parquet 기반 파일 시스템에서 쿼리를 실행할 때 필요한 데이터에 매우 빠르게 초점을 맞출 수 있습니다.

Python에서 Parquet 파일을 읽고 쓰는 Parquet 인터페이스

Python은 엔진을 사용하여 데이터 프레임에 쓰고 쪽모이 세공 파일을 읽습니다. 이 기사에서는 데이터베이스에 Parquet 파일을 작성하는 일부 엔진에 대해 설명합니다.

데이터 분석 시스템에서 사용하기 위해 Apache Parquet 프로젝트는 표준화된 오픈 소스 열 저장 형식을 제공합니다. Apache Arrow는 Parquet 파일에서 읽거나 쓰는 데이터를 위한 최고의 인메모리 전송 계층입니다.

Python에서 parquet 파일을 읽는 두 개의 parquet 인터페이스인 pyarrowfastparquet에 대해 알아봅니다.

Python의 PyArrow 모듈

Apache Arrow 또는 PyArrow는 메모리 내 분석 개발 플랫폼입니다. 빅 데이터 시스템이 데이터를 빠르게 저장, 처리 및 전송할 수 있는 기술 컬렉션이 있습니다.

이 코드는 pyarrow에 Python 바인딩되어 있어 Pandas를 사용하여 parquet 파일을 쓰고 읽을 수 있습니다.

pyarrow 설치는 pipconda로 쉽습니다.

pip의 경우 다음 명령을 사용합니다.

pip install pyarrow

conda의 경우 다음 명령을 사용합니다.

conda install -c conda-forge pyarrow

Python의 PyArrow 모듈을 사용하여 Parquet 파일에 DataFrame 쓰기

Python에서 데이터 프레임을 작성하고 Parquet 파일을 읽는 방법을 이해하기 위해 아래 프로그램에서 Pandas 테이블을 만들어 보겠습니다.

네 가지 가져오기가 필요합니다.

  1. pyarrow - 쪽모이 세공 마루 제품 작성용.
  2. numpy - 다차원 배열용.
  3. pandas - 데이터 프레임 생성용.
  4. parquet - pyarrow의 하위 기능입니다.

이 프로그램은 정수, 문자열 및 부울과 같은 여러 유형의 데이터 세트로 store1 데이터 프레임을 생성합니다. 색인 목록은 'abc'로 설정되어 알파벳 순서로 행을 정렬합니다.

table1 변수에서 Table.from_pandas() 구문을 사용하여 Pandas 테이블이 생성됩니다. 이 표는 결과를 확인하기 위해 인쇄됩니다.

import pyarrow.parquet as pq
import numpy as np

import pandas as pd

import pyarrow as pa

store1 = pd.DataFrame(
    {
        "first": [5, np.nan, -9],
        "second": ["apple", "samsung", "mi"],
        "third": [False, False, True],
    },
    index=list("abc"),
)

table1 = pa.Table.from_pandas(store1)
print(table1)

출력:

C:\python38\python.exe "C:/Users/Win 10/main.py"
pyarrow.Table
first: double
second: string
third: bool
__index_level_0__: string
----
first: [[5,null,-9]]
second: [["apple","samsung","mi"]]
third: [[false,false,true]]
__index_level_0__: [["a","b","c"]]

Process finished with exit code 0

이제 이 데이터는 write_table을 사용하여 쪽모이 세공 형식으로 작성됩니다. parquet 파일을 작성할 때 write_table() 함수에는 다양한 설정을 제어하기 위한 여러 인수가 포함됩니다.

  1. data_page_size - 이 매개변수는 열 청크 내에서 인코딩된 데이터 페이지의 대략적인 양을 조절합니다. 현재 1MB가 기본값입니다.
  2. flavor - spark와 같은 Apache Spark Parquet 소비자에 특정한 호환성 설정을 제공합니다.
  3. 버전 - 적절한 Parquet 형식 버전입니다. 1.0 이상의 값은 이전 판독기와의 호환성을 보장하지만 2.4 이상의 값은 더 많은 Parquet 유형 및 인코딩을 가능하게 합니다.

이 프로그램에서 write_table() 매개변수는 table1 테이블과 parquet parquet.txt를 쓰기 위한 기본 파일과 함께 제공됩니다.

문자열을 사용하지 않고 파일의 출처를 나타낼 수 있습니다. 다음 중 하나가 가능합니다.

  • 문자열로 된 파일 경로
  • 네이티브 PyArrow 파일
  • 파이썬의 파일 객체

이 테이블을 읽으려면 read_table() 함수를 사용합니다. 변수 table2는 테이블을 로드하는 데 사용됩니다.

마지막으로 이 parquet 파일은 table2.to_pandas()를 사용하여 Pandas 데이터 프레임으로 변환되고 인쇄됩니다.

pq.write_table(table1, "sample_file.parquet")

table2 = pq.read_table("sample_file.parquet")

table2.to_pandas()

print("\n", table2)

출력:

C:\python38\python.exe "C:/Users/Win 10/main.py"

 pyarrow.Table
first: double
second: string
third: bool

__index_level_0__: string
----

first: [[5,null,-9]]
second: [["apple","samsung","mi"]]
third: [[false,false,true]]
__index_level_0__: [["a","b","c"]]

Process finished with exit code 0

Parquet 파일은 일반적으로 거대한 데이터 파일이며 Python에서 Parquet 파일을 읽으려면 로드하는 데 시간이 오래 걸립니다. 따라서 전체 파일을 로드하는 대신 특정 열을 전달하여 데이터를 빠르게 읽을 수 있습니다.

변수 table3에서 pq.read_table 기능을 사용하여 데이터를 씁니다. 매개변수 괄호 안에 firstthird라는 두 개의 열이 제공됩니다.

table3 = pq.read_table("parquet.txt", columns=["first", "third"])
print(table3)

출력에 선택한 열이 표시됩니다.

출력:

C:\python38\python.exe "C:/Users/Win 10/main.py"
pyarrow.Table
first: double
third: bool
----
first: [[5,null,-9]]
third: [[false,false,true]]

Process finished with exit code 0

Pandas 데이터 프레임을 소스로 사용하여 파일에서 열의 하위 집합을 읽을 때 추가 인덱스 열 데이터를 유지하기 위해 read_pandas를 사용합니다.

table4 = pq.read_pandas("parquet.txt", columns=["second"]).to_pandas()
print(table4)

출력:

C:\python38\python.exe "C:/Users/Win 10/main.py"
       second
a    apple
b  samsung
c       mi

Process finished with exit code 0

문자열 파일 경로 또는 NativeFile의 인스턴스(특히 메모리 맵)는 일반적으로 읽기 속도가 가장 느린 Python 파일 개체보다 읽을 때 더 잘 수행됩니다.

인덱스(행 레이블) 추적을 유지하기 위해 pa.Table.from_pandas를 사용하여 테이블을 화살표 테이블로 변환할 때 하나 이상의 특수 열이 자동으로 생성됩니다. 인덱스가 가치가 없는 경우 인덱스를 저장하려면 더 많은 저장 공간이 필요하므로 preserve index=False를 전달하여 생략하도록 선택할 수 있습니다.

import numpy as np
import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq

store = pd.DataFrame(
    {
        "first": [5, np.nan, -9],
        "second": ["apple", "samsung", "mi"],
        "third": [False, False, True],
    },
    index=list("abc"),
)

print(store)

table = pa.Table.from_pandas(store, preserve_index=False)
pq.write_table(table, "sample_file.parquet")
t = pq.read_table("sample_file.parquet")

print("\n", t.to_pandas())

표시된 쪽모이 세공 파일의 인덱스가 지워졌습니다.

출력:

C:\python38\python.exe "C:/Users/Win 10/main.py"
   first   second  third
a    5.0    apple  False
b    NaN  samsung  False
c   -9.0       mi   True

    first   second  third
0    5.0    apple  False
1    NaN  samsung  False
2   -9.0       mi   True

Process finished with exit code 0

Python에서 PyArrow 모듈을 사용하여 Parquet 파일의 메타데이터 읽기

파일에서 데이터를 읽는 것 외에도 read_table 메서드가 사용하는 ParquetFile 클래스는 메타데이터 읽기와 같은 추가 기능을 제공합니다.

import pyarrow.parquet as pq

parquet_file = pq.ParquetFile("example.parquet")
print(parquet_file.metadata)

출력:

C:\python38\python.exe "C:/Users/Win 10/main.py"
<pyarrow._parquet.FileMetaData object at 0x000001DADCBDCA90>
  created_by: parquet-cpp-arrow version 9.0.0
  num_columns: 4
  num_rows: 3
  num_row_groups: 1
  format_version: 2.6
  serialized_size: 2580

Process finished with exit code 0

Python에서 Fastparquet 엔진을 사용하여 Parquet 파일에 데이터 쓰기

parquet 파일 형식을 위한 Python 인터페이스입니다.

이 프로그램은 fastparquet를 사용하여 쪽모이 세공 파일에 작성합니다. 데이터 프레임 storestudentmarks라는 두 개의 열로 생성됩니다.

데이터 프레임은 dataframe.to_parquet() 함수를 사용하여 쪽모이 세공 파일 sample.parquet에 기록됩니다.

엔진은 fastparquet로 선택되지만 pyarrow로 설정할 수도 있습니다.

import pandas as pd

store = pd.DataFrame(
    {
        "student": ["Michael", "Jackson", "N", "John", "Cena"],
        "marks": [20, 10, 22, 21, 22],
    }
)

print(store)
store.to_parquet("sample.parquet", engine="fastparquet")

출력:

C:\python38\python.exe "C:/Users/Win 10/main.py"
   student  marks
0  Michael     20
1  Jackson     10
2        N     22
3     John     21
4     Cena     22

Process finished with exit code 0

Parquet 파일에 데이터가 기록되었으므로 파일을 읽어 봅시다.

Python에서 Fastparquet 엔진을 사용하여 Parquet 파일 읽기

parquet 파일은 pd.read_parquet 함수를 사용하여 읽혀지며 엔진을 fastparquet로 설정하고 이를 변수 df에 저장합니다. 그런 다음 결과가 인쇄됩니다.

df = pd.read_parquet("sample.parquet", engine="fastparquet")
print(df)

출력:

C:\python38\python.exe "C:/Users/Win 10/PycharmProjects/read_parquet/main.py"
   student  marks
0  Michael     20
1  Jackson     10
2        N     22
3     John     21
4     Cena     22

Process finished with exit code 0

결론

이 문서에서는 Python에서 parquet 파일을 읽는 방법을 설명합니다. 프로그램 예제는 pyarrowfastparquet를 모두 사용하여 parquet 파일을 읽는 방법을 보여줍니다.

독자는 Python에서 parquet 파일을 읽는 프로그램을 쉽게 만들 수 있어야 합니다.