我是Azure Data Warehouse和Azure Data Factory V2的新手
我有一个文件夹,其中有10个文件中的azure blob,每个文件都有不同的标题,但是所有文件中都会有一个常见的5个标题。
我尝试过的东西,
创建了10个链接的服务器到文件,并使用复制数据任务将数据移至特定表。但是我只需要5列
问题
有什么办法可以有一个带有5列的表和一个动态文件连接到从5个文件中加载数据。
示例:文件1:10个标题文件2:11个标题File3:7个标题。。。。文件10:15个标题
这些文件中将有5列的常见,并且必须使用5列加载数据。
当您用polybase中的Azure SQL数据仓库中创建外部表格时,它们可以指向单个文件或一组文件,只要它们在同一文件夹中,并且以相同的格式。
单个文件
WTIH (
DATA_SOURCE = yourDataSource,
LOCATION = N'/input/file1.txt',
FILE_FORMAT = yourFileFormat,
...
etc
文件夹
WTIH (
DATA_SOURCE = yourDataSource,
LOCATION = N'/input/',
FILE_FORMAT = yourFileFormat,
...
etc
因此,您可以做的就是为每个文件创建一个外部表。外部表仅是元数据结构,数据库实际上并不存在。这些表必须包括每个表的所有列。然后在五个表上创建UNION
语句,仅选择五列并使用CTAS
将数据导入到数据库中:
CREATE TABLE dbo.yourTable
WITH
(
DISTRIBUTION = ROUND_ROBIN,
CLUSTERED COLUMNSTORE INDEX
)
AS
SELECT col1, col2, col3, col4, col5
FROM externalTable1
UNION ALL
SELECT col1, col2, col3, col4, col5
FROM externalTable2
UNION ALL
SELECT col1, col2, col3, col4, col5
FROM externalTable3
etc
....
我可能不会使用数据工厂,因为Polybase可以为您完成大部分工作。
您可以在下面采用:
1.使用查找活动以获取存储在特定Azure Blob存储容器或其他路径中的文件名列表。请参阅此链接。
2.使用for foreach活动循环查找活动[@activity('MyLookupActivity').output]
。
3.在foreach活动中,使用复制活动并将源blob存储数据集路径配置为 specific containerName/dynamic fileName
。(
我同意@wbob,polybase可以为您处理它。但是,作为替代方案,您可以使用Azure数据出厂数据流来处理所有文件,然后仅选择所需的5列,然后将这些结果输出到Blob接收器。然后将斑点用于polybase,这将简化您的polybase要求,或使用ADF复制活动将其写入您的SQLDW。这个空间中有很多选择。