Python에서 Parquet 파일 읽기 및 쓰기

Jay Shaw 2023년6월21일
  1. Python에서 Parquet 파일을 읽고 쓰는 Parquet 인터페이스
  2. Python의 PyArrow 모듈을 사용하여 Parquet 파일에 DataFrame 쓰기
  3. Python에서 PyArrow 모듈을 사용하여 Parquet 파일의 메타데이터 읽기
  4. Python에서 Fastparquet 엔진을 사용하여 Parquet 파일에 데이터 쓰기
  5. Python에서 Fastparquet 엔진을 사용하여 Parquet 파일 읽기
  6. 결론
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 파일을 읽는 프로그램을 쉽게 만들 수 있어야 합니다.

관련 문장 - Python File