簡體   English   中英

PySpark:使用選定的列或分區優化從 Delta 讀取/加載

[英]PySpark : Optimize read/load from Delta using selected columns or partitions

我正在嘗試將來自 Delta 的數據加載到 pyspark dataframe 中。

path_to_data = 's3://mybucket/daily_data/'
df = spark.read.format("delta").load(path_to_data)

現在基礎數據按日期划分為

s3://mybucket/daily_data/
    dt=2020-06-12
    dt=2020-06-13
    ...
    dt=2020-06-22

有沒有辦法將讀取優化為 Dataframe,給出:

  1. 只需要特定的日期范圍
  2. 只需要列的子集

目前,我嘗試過的方法是:

df.registerTempTable("my_table")
new_df = spark.sql("select col1,col2 from my_table where dt_col > '2020-06-20' ")
# dt_col is column in dataframe of timestamp dtype.

在上面的 state 中,Spark 是否需要加載整個數據,根據日期范圍過濾數據,然后過濾所需的列? 是否可以在 pyspark 讀取中進行任何優化,以加載數據,因為它已經分區?

在線的東西:

df = spark.read.format("delta").load(path_to_data,cols_to_read=['col1','col2'])
or 
df = spark.read.format("delta").load(path_to_data,partitions=[...])

在您的情況下,不需要額外的步驟。 Spark 將負責優化。 由於當您嘗試使用分區列dt作為過濾條件查詢數據集時,您已經根據列dt對數據集進行了分區。 Spark 僅從源數據集中加載與過濾條件匹配的數據子集,在您的情況下為dt > '2020-06-20'

Spark 在內部進行基於優化的分區修剪。

要做到這一點沒有 SQL..

from pyspark.sql import functions as F

df = spark.read.format("delta").load(path_to_data).filter(F.col("dt_col") > F.lit('2020-06-20'))

雖然對於這個例子,你可能需要做一些比較日期的工作。

暫無
暫無

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

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