[Python] Join large partitioned parquet datasets in Polars and write to Postgres?

Discussão em 'Python' iniciado por Stack, Março 6, 2025.

  1. Stack

    Stack Membro Participativo

    I have two large datasets stored in partitioned Parquet format on S3, partitioned by category_id. I need to join them on category_id and label_id using Polars and write the results to Postgres.

    The problem:

    • Data is too large for memory: Calling .collect() on the joined dataframe is not feasible.
    • Writing per partition is too slow: Iterating over category_id and processing each partition takes too long (several seconds per partition).

    My current approach:

    import polars as pl

    df_left = pl.scan_parquet(
    "s3://my-bucket/left/**/*.parquet",
    hive_partitioning=True,
    )
    df_right = pl.scan_parquet(
    "s3://my-bucket/right/**/*.parquet",
    hive_partitioning=True,
    )

    df_joined = df_left.join(df_right, on=["category_id", "label_id"], how="inner")


    At this point, I would like to efficiently:

    • Process the data in a streaming fashion
    • Write the joined data to Postgres

    What I have tried:

    1. Looping over unique category_ids and processing one by one.
      • Too slow, as reading Parquet partitions takes a few seconds each time.
    2. Using Polars' lazy execution (scan_parquet).
      • I cannot .collect() since it does not fit in memory.
      • I am unsure how to efficiently stream the data to Postgres.
    Question


    How can I efficiently join two large Parquet datasets using Polars and write the result to Postgres in a way that avoids memory issues and excessive partition reads?

    Would using Polars streaming help here? Or is there a way to batch-process partitions efficiently without reading each partition multiple times?

    Continue reading...

Compartilhe esta Página