簡體   English   中英

Spark 數據框:它什么時候實現?

[英]Spark dataframe : When does it materialize?

我有一個火花問題:

我有一份工作出錯了: 403 Access Denied on S3

火花工作基本上是:

  1. 從 Glue Catalog 的 LF 資源鏈接表中獲取數據
  2. 創建臨時視圖
  3. 運行一堆轉換
  4. 將數據存儲在外部位置

在進行大量轉換的第 3 步中,我偶爾會遇到錯誤。 我說零星的,因為有時我不會得到任何錯誤,而其他時候它會在第 3 步中存在的任何一個函數上彈出。

不會在膠水動態框架上運行 spark sql select 語句(並將其存儲為臨時視圖)在內存中的 spark 會話中具體化數據嗎? 例如:

    df=glueContext.create_dynamic_frame_from_catalog(args)
    df=df.toDF
    df.createorreplacetempview(tbl1)
    dfnew=spark.sql(select * from tbl1)
    dfnew.createorreplacetempview(tbl2)


..step3 transformations on tbl2(this is where the error happens)

我的理解是否正確,因為 tbl1 已經具體化到內存中的 spark 會話中,但 tbl2 仍然被延遲存儲? 如果是這樣,那么如果我在 tbl2 上運行 spark sql 語句,它將通過從 tbl1 查詢而不是膠水目錄源表來實現,對嗎?

由於上游數據不斷更新,我如何確保在上述腳本中將 LF 表放入動態框架后不訪問它們?

您對 spark SQL 視圖的理解不正確。

Spark SQL視圖是延遲計算的,在您調用操作之前不會真正實現。 事實上,直到並且除非你調用一個動作,否則沒有一個惰性評估的部分(在 Spark 技術術語中也稱為轉換)被具體化。

它所做的只是在后端創建一個 DAG,其中包含您迄今為止完成的所有轉換,並在您調用操作時實現所有這些轉換。

df.createorreplacetempview(tbl1) #lazily-evaluated
dfnew=spark.sql(select * from tbl1) #lazily-evaluated
dfnew.createorreplacetempview(tbl2) #lazily-evaluated
dfnew.show() #Action call --> materilaizes all the transformations done so far.

您收到的錯誤很可能是因為讀取或寫入特定 S3 位置時的權限。

我希望這能回答你的前半部分問題。 如果您可以分享轉換中發生的事情,或者如果您在這些轉換期間使用任何操作,或者最好的方法是共享錯誤的stacktrace以獲得更明確的答案,則可以更好地解釋。

此外,如果您使用的是Spark 3.0 or higher ,則可以使用noop寫入格式來實現您的轉換。

df.write.mode("overwrite").format("noop").save()

您可以簡單地將其指定為write格式,它將具體化查詢並執行所有轉換,但不會將結果寫入任何地方。

暫無
暫無

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

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