Azure-Sql-Data-Warehouse

如何忽略 parquet/polybase 導入中的列?

  • March 24, 2020

我正在使用 polybase 導入鑲木地板文件。

隨著時間的推移,我們可能會在文件中添加或刪除命名列。

當我添加一個額外的列時,我收到以下錯誤:

由於內部錯誤,外部文件訪問失敗:‘文件 test.parquet:HdfsBridge::CreateRecordReader - 創建記錄讀取器時遇到意外錯誤:HadoopExecutionException:列數不匹配。源文件有 16 列,外部表定義有 15 列。

這是因為我添加了一個不在外部表定義中的附加列。

由於 parquet 包含文件模式並且外部表知道每列的名稱,有沒有辦法可以將其設置為忽略額外未使用的列?

Polybase 沒有這種能力。源文件和外部表定義必須匹配才能正常工作。只需在外部表定義中添加或刪除其他列。然後,當您在數據庫中物理創建表時,例如通過 CTAS,從您的 CTAS 語句中添加/刪除附加列。

或者,考慮新的COPY INTO語句。這確實有能力指定一個列列表,例如

COPY INTO test_parquet ( col1, col2, col3, col4 )
FROM 'https://myaccount.blob.core.windows.net/myblobcontainer/folder1/*.parquet'
WITH (
   FILE_FORMAT = myFileFormat
   CREDENTIAL = ( IDENTITY = 'Shared Access Signature', SECRET = '<Your_SAS_Token>' )
)

但是請注意,此功能是 i) 目前處於預覽狀態,ii) 用於復製到物理表(即不是外部表)中,以及 iii) 我沒有專門使用 Parquet 測試列列表。

引用自:https://dba.stackexchange.com/questions/262607