大家好,
我有20年的數據,600行。
我有分區在年和月生成的一個文件大小似乎是合理的(128 mb)。
查詢所有數據使用時間戳,所有查詢需要過濾的確切時間。
所以我的要求是,當過濾時間戳它隻是訪問一年和月分區相當於時間戳。
這似乎是可行的使用生成的列,根據磚和微軟的文檔。
https://docs.delta.io/latest/delta-batch.html use-generated-columns
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版本,所以這應該是支持。
有人做到了這一點嗎?或者你可以在我的示例中看到任何問題嗎?
最好的問候,
拉姆
嗨@Suteja卡努裏人,
我認為你誤解了我的帖子。運動三角洲湖在Azure存儲不的幫助。它仍然顯示,所有被掃描在where子句中使用時間戳。
我不包括分區列本身在where子句中,我隻包括分區的列的列(時間戳)來自哪裏。
按照文檔應優化器能夠使用partitionfilter,但它沒有。
三角洲湖可以生成分區時過濾器為一個查詢分區列被定義為一個以下表達式:
如果一個分區列被定義為一個前麵的表達式,使用底層的基礎和查詢過濾器數據列的表達式,一代三角洲湖看著基列之間的關係,生成的列,並填充分區過濾器生成基於分區列如果可能的話。
@Rasmus Stokholm:
根據你所提到的,似乎分區過濾器不被優化器使用,即使必要的分區列定義和查詢使用底層基礎列代的表達式。這可能是由於很多因素,包括特定查詢的語法或結構的數據。
你可以試著一個潛在的解決方案是使用解釋命令獲得更多信息查詢是如何被執行的。這可以幫助識別任何問題與查詢語法或數據結構,可能阻止優化器使用分區過濾器。此外,你可以試著重新組織或重新格式化的數據查詢,看看這使得不同分區過濾器是如何被使用的。
@Rasmus Stokholm:這有幫助嗎?
可能是分區修剪是不會發生的,因為分區列沒有被正確地定義為一種時間戳。三角洲湖使用分區信息來優化查詢和加快數據訪問,所以重要的是要確保正確定義分區列。
你可以檢查你的分區信息表通過運行描述擴展命令在三角洲湖。這將給你更多的信息表,包括分區方案和分區的列的數據類型。
如果分區列沒有正確定義為一種時間戳,你可以試著改變表重新定義分區列作為一個時間戳。例如,如果您的分區列被稱為“日期”,您可以運行下麵的命令來重新定義為時間戳:
ALTER TABLE mytable分區(日期時間戳)
一旦確認分區列定義為一個時間戳是正確的類型,你可以嚐試再次運行您的查詢和分區修剪是否按預期工作。