簡體   English   中英

將 Azure Blob 分區添加到 Azure SQL 表

[英]Add Azure Blob Partitions to Azure SQL Table

我在 Azure Blob 中對 Parquet 文件進行了分區,並將其復制到 Azure SQL。 如何將分區名稱放入 SQL 表中?

我已經想出了如何通過在復制活動的源數據部分添加一個附加列來獲得 SQL 表的完整文件路徑(圖像 1 和 2),但我試圖弄清楚如何正則表達式完整文件路徑到分區名稱 (202105)。

在 Copy Activity 中源數據的數據預覽中,它顯示了僅包含分區名稱的 time_period 列(圖 3)。 但是當它出現在 SQL 中時,它對於所有行都是 NULL(或者它是完整的文件路徑,取決於我是否在復制活動的源數據部分添加了附加列)。

圖 1: 使用 $$FILEPATH 的圖像 1

圖 2: 文件路徑設置參數的圖像2

圖 3: 顯示該列顯示在預覽中

我嘗試在 Azure SQL 中將 time_period 的數據類型更改為 INT。 我試過解析$$FILEPATH ,但我試過的沒有任何效果。

我基本上是從頭開始,因為我確信有更好的。 額外的背景在這里和可能在這里

類似於這個

正如解釋這里在MS文檔,你可以利用enablePartitionDiscovery功能。

來源:分區文件:

在此處輸入圖片說明

源數據集:

剛剛提到了容器名稱,並將目錄和文件字段留空。 我們將在復制活動中使用WildCard paths過濾它們。

在此處輸入圖片說明

Copy Activity根據您的文件路徑配置源:

注意:您可以跳過第 4 步,即帶有$$FILEPATH附加列,僅供參考。 您可以刪除這一位,因為您已經使用enablePartitionDiscovery獲得了就緒列。

在此處輸入圖片說明

對於要選擇的單個文件夾,您將設置如下。

通配符路徑: sink / columnparts / time_period=202105 / *.parquet

對於多個文件夾time_period=202105 , time_period=202106 ..... 如之前的 sinp 中所見,設置如下。

**將取代父文件夾columnparts的任何文件夾

通配符路徑: sink / columnparts / ** / *.parquet

分區根路徑:這應該指向所有分區文件夾所在的父文件夾。

在我的例子中: sink/columnparts

啟用分區發現時必須提供分區根路徑。

在此處輸入圖片說明

Sink:可選更新現有表或創建一個新表。

在此處輸入圖片說明

從 SQL DB 中查看: time_period列包含值202105

time_period=202105/part-00004-fcbe0bf5-2c93-45f5-9bb2-2f9089a3e83a-c000.snappy.parquet

在此處輸入圖片說明

如果您看到此錯誤:

在此處輸入圖片說明

您有一個未更新的映射! 在映射部分,您可以clearreset架構並再次Import schema以確保安全。 😊

在我的情況下,它是附加列file_path

在此處輸入圖片說明

- 或者 -

$$FILEPATH是保留變量,不能在表達式構建器或函數中使用它來操作。

相反,如果您可以在復制到 SQL DB 后合並一個步驟,即使用如下存儲過程。

path保存從$$FILEPATH收到的完整文件路徑,正如您已經管理的那樣。 StoreParquetTest是在 SQL sink中創建的表

CREATE PROCEDURE trimpath
AS
    UPDATE StoreParquetTest
    SET path = SUBSTRING(path,(CHARINDEX('=',path) + 1), ((CHARINDEX('/',path) - CHARINDEX('=',path) -1)))
GO

現在您可以在復制活動之后使用管道中的存儲過程活動。

在此處輸入圖片說明

在此處輸入圖片說明

在此處輸入圖片說明

暫無
暫無

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

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