取消
顯示的結果
而不是尋找
你的意思是:

疊加datetime過濾器的分區。

Stokholm
新的貢獻者三世

大家好,

我有20年的數據,600行。

我有分區在年和月生成的一個文件大小似乎是合理的(128 mb)。

查詢所有數據使用時間戳,所有查詢需要過濾的確切時間。

所以我的要求是,當過濾時間戳它隻是訪問一年和月分區相當於時間戳。

這似乎是可行的使用生成的列,根據磚和微軟的文檔。

表批讀寫——三角洲湖文檔

https://docs.delta.io/latest/delta-batch.html use-generated-columns

使用生成的列湖三角洲——微軟Azure磚|學習

https://learn.microsoft.com/en-us/azure/databricks/delta/generated-columns

通常說的一樣的。

DeltaTable.create(火花)\ .tableName (default.events) \ .addColumn (“eventId”、“長整型數字”)\ .addColumn(“數據”、“字符串”)\ .addColumn (“eventType”、“字符串”)\ .addColumn (“eventTime”、“時間戳”)\ .addColumn(“年”、“INT”generatedAlwaysAs =”(eventTime)”) \ .addColumn(“月”,“INT”, generatedAlwaysAs =月(eventTime)) \ .addColumn(“天”、“INT”, generatedAlwaysAs =“天(eventTime)”) \ .partitionedBy (“eventType”、“年”、“月”、“日”)\ . execute ()
火花。sql (' SELECT * FROM違約。事件,eventTime > = " 2020-10-01就是" < =“2020-10-01 12:00:00”)

“三角洲湖自動生成一個分區過濾器,這樣前麵的查詢隻讀取數據分區

年= 2020 /月= 10 /天= 1

即使沒有指定分區過濾器。

你可以使用一個解釋條款並檢查所提供的計劃是否三角洲湖自動生成任何分區過濾器。”

我的問題是,當我使用解釋命令,你可以清楚地看到它使用partitionfilter。

% sql解釋格式化SELECT * FROM違約。events2 eventTime =“2023-01-01”就是
= = * = =物理計劃項目(4)+ - *過濾器(3)+ - * ColumnarToRow(2) + -掃描鋪違約。events2(1)(1)掃描鋪違約。events2輸出[7]:[eventId # 25670469 l,數據# 25670470,eventTime # 25670472, eventType # 25670471, # 25670473, # 25670474,月日# 25670475)成批的:真正的位置:PreparedDeltaFileIndex [dbfs: / user /蜂巢/倉庫/ events2] PushedFilters: [IsNotNull (eventTime),等於(eventTime, 2023-01-01 00:00:00.0)] ReadSchema: struct < eventId:長整型數字、數據:字符串,eventTime:時間戳> (2)ColumnarToRow [codegen id: 1)輸入[7]:[eventId # 25670469 l,數據# 25670470,eventTime # 25670472, eventType # 25670471, # 25670473, # 25670474,月日# 25670475)(3)過濾器(codegen id: 1)輸入[7]:[eventId # 25670469 l,數據# 25670470,eventTime # 25670472, eventType # 25670471, # 25670473, # 25670474,月日# 25670475)條件:(IsNotNull (eventTime # 25670472)和(eventTime # 25670472 = 25670472就是))(4)項目(codegen id: 1)輸出[7]:[eventId # 25670469 l,數據# 25670470,eventType # 25670471, eventTime # 25670472, # 25670473, # 25670474,月日# 25670475)輸入[7]:[eventId # 25670469 l,數據# 25670470,eventTime # 25670472, eventType # 25670471, # 25670473, # 25670474,月日# 25670475)

好像我有一天,你可以清楚地看到一個分區過濾器。

“PartitionFilters: [isnotnull(# 25670689),(天# 25670689 = 1)”

% sql解釋格式化SELECT * FROM違約。events2 eventTime =“2023-01-01”就是和天= 1
= = * = =物理計劃項目(4)+ - *過濾器(3)+ - * ColumnarToRow(2) + -掃描鋪違約。events2(1)(1)掃描鋪違約。events2輸出[7]:[eventId # 25670683 l,數據# 25670684,eventTime # 25670686, eventType # 25670685, # 25670687, # 25670688,月日# 25670689)成批的:真正的位置:PreparedDeltaFileIndex [dbfs: / user /蜂巢/倉庫/ events2] PartitionFilters: [isnotnull(# 25670689),(# 25670689 = 1天)]PushedFilters: [isnotnull (eventTime),等於(eventTime, 2023-01-01 00:00:00.0)] ReadSchema: struct < eventId:長整型數字、數據:字符串,eventTime:時間戳> (2)ColumnarToRow [codegen id: 1)輸入[7]:[eventId # 25670683 l,數據# 25670684,eventTime # 25670686, eventType # 25670685, # 25670687, # 25670688,月日# 25670689)(3)過濾器(codegen id: 1)輸入[7]:[eventId # 25670683 l,數據# 25670684,eventTime # 25670686, eventType # 25670685, # 25670687, # 25670688,月日# 25670689)條件:(isnotnull (eventTime # 25670686)和(eventTime # 25670686 = 25670686就是))(4)項目(codegen id: 1)輸出[7]:[eventId # 25670683 l,數據# 25670684,eventType # 25670685, eventTime # 25670686, # 25670687, # 25670688,月日# 25670689)輸入[7]:[eventId # 25670683 l,數據# 25670684,eventTime # 25670686, eventType # 25670685, # 25670687, # 25670688,月日# 25670689)

我們在10.4版本,所以這應該是支持。

有人做到了這一點嗎?或者你可以在我的示例中看到任何問題嗎?

最好的問候,

拉姆

9回複9

Stokholm
新的貢獻者三世

嗨@Suteja卡努裏人,

我認為你誤解了我的帖子。運動三角洲湖在Azure存儲的幫助。它仍然顯示,所有被掃描在where子句中使用時間戳。

我不包括分區列本身在where子句中,我隻包括分區的列的列(時間戳)來自哪裏。

按照文檔應優化器能夠使用partitionfilter,但它沒有。

三角洲湖可以生成分區時過濾器為一個查詢分區列被定義為一個以下表達式:

  • (col)和坳的類型是時間戳。
  • 兩個分區列定義為一年(col)月(col)和類型的坳是時間戳。

如果一個分區列被定義為一個前麵的表達式,使用底層的基礎和查詢過濾器數據列的表達式,一代三角洲湖看著基列之間的關係,生成的列,並填充分區過濾器生成基於分區列如果可能的話。

匿名
不適用

@Rasmus Stokholm:

根據你所提到的,似乎分區過濾器不被優化器使用,即使必要的分區列定義和查詢使用底層基礎列代的表達式。這可能是由於很多因素,包括特定查詢的語法或結構的數據。

你可以試著一個潛在的解決方案是使用解釋命令獲得更多信息查詢是如何被執行的。這可以幫助識別任何問題與查詢語法或數據結構,可能阻止優化器使用分區過濾器。此外,你可以試著重新組織或重新格式化的數據查詢,看看這使得不同分區過濾器是如何被使用的。

Stokholm
新的貢獻者三世

嗨@Suteja卡努裏人

我試著解釋命令在幾個不同的查詢類型。

很簡單的查詢時,同時也更複雜,限製其他列。

沒有一個應用partitionfilter隻有在where子句中使用時間戳。

如果我使用where子句中的partition-columns partitionfilters執行,查詢會快很多。(當然)

但它是最重要的,這種過濾使用時間戳。所有用戶使用這些表過濾時間戳。

匿名
不適用

@Rasmus Stokholm:這有幫助嗎?

可能是分區修剪是不會發生的,因為分區列沒有被正確地定義為一種時間戳。三角洲湖使用分區信息來優化查詢和加快數據訪問,所以重要的是要確保正確定義分區列。

你可以檢查你的分區信息表通過運行描述擴展命令在三角洲湖。這將給你更多的信息表,包括分區方案和分區的列的數據類型。

如果分區列沒有正確定義為一種時間戳,你可以試著改變表重新定義分區列作為一個時間戳。例如,如果您的分區列被稱為“日期”,您可以運行下麵的命令來重新定義為時間戳:

ALTER TABLE mytable分區(日期時間戳)

一旦確認分區列定義為一個時間戳是正確的類型,你可以嚐試再次運行您的查詢和分區修剪是否按預期工作。

Stokholm
新的貢獻者三世

嗨,夥計們,謝謝你的建議。我找到了一個解決方案。我們升級磚運行時12.2,現在的疊加partitionfilter作品。文檔表示,10.4將是足夠的,但顯然這是不夠的。

歡迎來到磚社區:讓學習、網絡和一起慶祝

加入我們的快速增長的數據專業人員和專家的80 k +社區成員,準備發現,幫助和合作而做出有意義的聯係。

點擊在這裏注冊今天,加入!

參與令人興奮的技術討論,加入一個組與你的同事和滿足我們的成員。

Baidu
map