การทำงานกับไฟล์ Parquet

การปรับขนาดและเพิ่มประสิทธิภาพ Data Pipeline ด้วย Polars

Liam Brannigan

Data Scientist & Polars Contributor

รูปแบบการจัดเก็บไฟล์

แผนภาพของ DataFrame

การปรับขนาดและเพิ่มประสิทธิภาพ Data Pipeline ด้วย Polars

รูปแบบ CSV

แผนภาพแสดงการจัดเก็บ CSV แบบรายแถว โดยแต่ละระเบียนถูกเก็บครบทั้งแถว

การปรับขนาดและเพิ่มประสิทธิภาพ Data Pipeline ด้วย Polars

รูปแบบ Parquet

แผนภาพแสดงการจัดเก็บ Parquet แบบเชิงคอลัมน์ โดยค่าจากคอลัมน์เดียวกันถูกจัดกลุ่มไว้ด้วยกัน

การปรับขนาดและเพิ่มประสิทธิภาพ Data Pipeline ด้วย Polars

การแปลงไฟล์เก็บถาวร

(
    pl.read_csv("311_Service_Requests.csv", try_parse_dates=True)

)
การปรับขนาดและเพิ่มประสิทธิภาพ Data Pipeline ด้วย Polars

การแปลงไฟล์เก็บถาวร

(
    pl.read_csv("311_Service_Requests.csv", try_parse_dates=True)
    .write_parquet("311_Service_Requests.parquet")
)
การปรับขนาดและเพิ่มประสิทธิภาพ Data Pipeline ด้วย Polars

การตรวจสอบไฟล์ Parquet

pl.read_parquet_schema(
    "311_Service_Requests.parquet"
)
Schema(
    "CREATED_DATE": Datetime,
    "TYPE": String,
    "STATUS": String,
    "DEPARTMENT": String,
    "WARD": Int64,
    ...
)
การปรับขนาดและเพิ่มประสิทธิภาพ Data Pipeline ด้วย Polars

CSV vs Parquet

$$

CSV
  • 4.8 GB
  • 14 วินาที

$$

Parquet
  • 0.6 GB
  • 1.4 วินาที

ภาพประกอบเปรียบเทียบ CSV กับ Parquet

การปรับขนาดและเพิ่มประสิทธิภาพ Data Pipeline ด้วย Polars

Parquet ไม่เหมาะสำหรับการเพิ่มแถว

new_request = {"TYPE": "Pothole", "STATUS": "Open", ...}
  • CSV สำหรับการเพิ่มข้อมูล
  • Parquet สำหรับการอ่านข้อมูล
การปรับขนาดและเพิ่มประสิทธิภาพ Data Pipeline ด้วย Polars

Row group ของ Parquet

แผนภาพแสดงไฟล์ Parquet ที่แบ่งออกเป็น row group

การปรับขนาดและเพิ่มประสิทธิภาพ Data Pipeline ด้วย Polars

การกรองข้อมูลด้วย row group

(
    pl.scan_parquet("311_Service_Requests.parquet")
    .filter(pl.col("CREATED_DATE") < pl.datetime(2020, 1, 1))
)
การปรับขนาดและเพิ่มประสิทธิภาพ Data Pipeline ด้วย Polars

Row group ของ Parquet

แผนภาพของไฟล์ Parquet พร้อม row group

การปรับขนาดและเพิ่มประสิทธิภาพ Data Pipeline ด้วย Polars

Row group ของ Parquet

แผนภาพของไฟล์ Parquet พร้อม row group และสถิติ

การปรับขนาดและเพิ่มประสิทธิภาพ Data Pipeline ด้วย Polars

การสแกนด้วยกลยุทธ์แบบขนาน

(
    pl.scan_parquet(
        "311_Service_Requests.parquet",

    )
)
การปรับขนาดและเพิ่มประสิทธิภาพ Data Pipeline ด้วย Polars

การสแกนด้วยกลยุทธ์แบบขนาน

(
    pl.scan_parquet(
        "311_Service_Requests.parquet",
        parallel="row_groups",
    )
)
  • columns
  • prefiltered
  • none
การปรับขนาดและเพิ่มประสิทธิภาพ Data Pipeline ด้วย Polars

การควบคุมการเขียนไฟล์ Parquet

department_counts.write_parquet(
    "department_counts.parquet",
    compression_level=3,

)
  • ขนาดไฟล์เล็กลง
  • ใช้เวลาอ่านและเขียนนานขึ้น
การปรับขนาดและเพิ่มประสิทธิภาพ Data Pipeline ด้วย Polars

การควบคุมการเขียนไฟล์ Parquet

department_counts.write_parquet(
    "department_counts.parquet",
    compression_level=3,
    row_group_size=25_000,
)
  • ขนาดไฟล์เล็กลง
  • ใช้เวลาอ่านและเขียนนานขึ้น
  • มีสถิติให้อ่านมากขึ้น
การปรับขนาดและเพิ่มประสิทธิภาพ Data Pipeline ด้วย Polars

มาฝึกกันเถอะ!

การปรับขนาดและเพิ่มประสิทธิภาพ Data Pipeline ด้วย Polars

Preparing Video For Download...