簡體   English   中英

從鑲木地板文件中查詢值小於特定數量的排序列的最后一行

[英]Querying last row of sorted column where value is less than specific amount from parquet file

我有一個大型鑲木地板文件,其中一列中的數據已排序。 下面是一個非常簡化的示例。

    X   Y
0   1   Red
1   5   Blue
2   8   Green
3   12  Purple
4   15  Blue
5   17  Purple

我有興趣查詢 Y 列的最后一個值,因為 X 以最有效的方式使用 python 小於某個數量。

我保證 X 列按升序排序。

例如,假設 X 小於 11,我希望 Y 值為“綠色”。

我嘗試了以下方法:

columns='Y'
filters=[('X','<',11]

pd.read_parquet('my_data.parquet',filters=filters,columns=columns).tail(1)

上面的代碼“有效”,但我希望可以進行優化,因為此查詢每天運行 100 萬次以上。

parquet 文件太大,無法讀入 memory。

我無法為“X”列設置起始值,因為無法保證 X 值之間的差距大小。例如,如果我要求“X > 10 和 X < 11”,我將得不到返回 Y 的值。

我希望鑒於數據已排序這一事實,有一種方法可以對其進行優化。

我願意使用 DuckDB 或其他一些庫來執行此操作。

我認為這就是.search_sorted()的用途。

您還可以使用.scan_parquet()來延遲加載數據而不是.read_parquet()

您可能需要使用when/then來處理第一行匹配的情況 - 並使用索引0而不是row - 1 - 或者沒有匹配的情況(如果可能的話)。

(pl.scan_parquet("search.parquet")
   .select(
      pl.col("Y")
        .take(pl.col("X").search_sorted(11, side="left") - 1)
).collect()
shape: (1, 1)
┌───────┐
│ Y     │
│ ---   │
│ str   │
╞═══════╡
│ Green │
└───────┘

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM