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

“檢測模式變化”錯誤在從三角洲表讀取數據流在應用“改變NOT NULL列下降”多個列。

Anatoly
新的貢獻者三世

這就跟你問聲好!

我有一個差值表和一個過程,從這個表讀取流。

我需要刪除非空約束的這個表的列。

第一個命令不會影響閱讀流下降。

但第二個命令的結果在錯誤:

StreamingQueryException:檢測模式改變舊模式:根——一個:字符串(nullable = true)——b:字符串(nullable = true)——c:時間戳(nullable = false)新模式:根——一個:字符串(nullable = true)——b:字符串(nullable = false)——c:時間戳(nullable = false)

完整的python筆記本:

#磚筆記本源#魔法% sql #魔法創造模式temp_schema #命令- - - - - - - - - - - # %魔法temp_schema sql #魔法創建表。temp_stream_table(#魔法NOT NULL字符串,#魔法b非空字符串,c #魔法時間戳NOT NULL #魔法)#魔法位置“dbfs: / tmp / temp_stream_table”命令- - - - - - - - - - - # #魔法% sql插入temp_schema #魔法。temp_stream_table #魔法值(“a”、“b”,當前日期),(“c”,“d”,當前日期)#命令- - - - - - - - - - - def run_stream():返回(火花.readStream .option .table (“mergeSchema”、“true”) (“temp_schema.temp_stream_table”) .writeStream .trigger (availableNow = true) .option (“checkpointLocation”、“dbfs / tmp / temp_stream_checkpoint”) .foreachBatch(λdf, _id:沒有).start () .awaitTermination()) #命令- - - - - - - - - - - run_stream()命令- - - - - - - - - - - # #魔法% sql ALTER TABLE temp_schema #魔法。temp_stream_table #魔法改變列NOT NULL下降;#命令- - - - - - - - - - - run_stream() #成功!#命令- - - - - - - - - - - #魔法% sql ALTER TABLE temp_schema #魔法。temp_stream_table #魔法改變NOT NULL列b下降;#命令- - - - - - - - - - - run_stream() # # #失敗:StreamingQueryException:檢測模式改變……#命令- - - - - - - - - - - #魔法% sql #魔法DROP TABLE temp_schema.temp_stream_table;#魔法下降模式- - - - - - - - - - - dbutils.fs temp_schema #命令。rm (“dbfs: / tmp / temp_stream_checkpoint”,真的)dbutils.fs。rm (“dbfs: / tmp / temp_stream_table”,真的)

這是一個錯誤嗎?

9回複9

Kaniz
社區經理
社區經理

嗨@Anatoly Tikhonov,請指定您的DBR版本嗎?

以防你在DBR 11.2版本,如果你現在想刪除一個增量表約束的名字,不存在約束,你會得到一個錯誤。之前的行為,也不會拋出錯誤如果約束條件不存在,你現在必須使用如果存在語句。看到ALTER TABLE

Anatoly
新的貢獻者三世

LTS DBR 10.4。

還測試了11.3 LTS -相同的結果。

Anatoly
新的貢獻者三世

@Kaniz Fatma放棄約束使用的命令是:

ALTER TABLE temp_schema。temp_stream_table改變列NOT NULL下降;

這意味著,我想使列可以為空,而不是放棄它。

錯誤出現在readStream一步,沒有約束。

Kaniz
社區經理
社區經理

嗨@Anatoly Tikhonov,我理解你的意思。

讀取流將拋出一個異常如果有更新或刪除在你的δ源。這也是從磚文檔:

結構化流不處理不是一個附加的輸入,將拋出一個異常如果發生任何修改在桌子上被用作源。

如果你使用IgnoreChanges,真的,它不會拋出異常,但會給你更新的行+行已經被處理。

這是因為δ表文件級別上發生的一切。

例如,如果您更新一個文件中的一行(大約),以下將會發生:

  1. 查找和閱讀文件,其中包含要更新的記錄
  2. 寫一個新文件包含+更新記錄所有其他數據在舊的文件。
  3. 舊的文件標記為刪除和新文件添加到事務日誌。
  4. 你讀過流將讀取整個文件作為新記錄。這意味著你可以重複你的蒸汽。

這也是在文檔中提到的。

ignoreChanges:處理文檔更新如果源表中的文件必須重寫由於數據更改操作,如更新、合並,刪除(分區),或覆蓋。

整個行可能仍然被釋放;因此,您的下遊消費者應該能夠處理重複……

你必須決定如果這是你的用例。如果您需要處理更新和刪除具體來說,磚改變數據提要,您可以啟用增量表上。這給你行級詳細信息插入、添加和刪除(在一些額外存儲的成本和IO)。

Vidula_Khanna
主持人
主持人

嗨@Anatoly Tikhonov

希望一切進行得很順利。

做@Kaniz Fatma反應回答了你的問題?如果是的,你會很高興它標記為最好,其他成員可以找到解決方案更快嗎?

我們很想聽到你的聲音。

謝謝!

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

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

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

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

Baidu
map