1

我是 Azure 数据仓库和 Azure 数据工厂 V2 的新手。

我有一个文件夹,在 azure blob 中有 10 个文件,每个文件都有不同的标题,但所有文件中都有一个共同的 5 个标题。

我尝试过的事情,

为文件创建了 10 个链接服务器,并使用复制数据任务将数据移动到特定表中。但我只需要这些表中的 5 列

问题

有什么方法可以让我拥有一个包含 5 列的表和一个动态文件连接来从 5 个文件中加载数据。

示例: File1:10 个标头 File2:11 个标头 File3:7 个标头。. . . File10:15 个标题

这些文件中共有 5 列,并且必须将数据加载到具有 5 列的公用表中。

4

3 回答 3

2

在使用 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语句,只选择五个列并使用 aCTAS将数据导入数据库:

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 可以为您完成大部分工作。

于 2019-05-31T14:29:58.267 回答
0

您可以采用以下想法:

1.使用LookUp Activity获取存储在您的特定 azure blob 存储容器或其他路径中的文件名列表。请参考此链接

2.使用ForEach Activity循环 LookUp Activity 的输出[@activity('MyLookupActivity').output]

3.在ForEach Activity内部,使用copy Activity并将源blob存储数据集路径配置为 specific containerName/dynamic fileName。(如本例解决方案:尝试在azure data factory V2中添加动态文件名(链接服务器)时遇到错误

于 2019-05-29T09:38:17.230 回答
0

我同意 @wBob 的观点,Polybase 可以为您处理这个问题。但是,作为替代方案,您可以使用 Azure 数据工厂数据流处理所有文件并仅选择所需的 5 列,然后将这些结果输出到 blob 接收器。然后为 Polybase 使用 blob,这将简化您的 Polybase 要求,或者使用 ADF Copy 活动将它们写入您的 SQLDW。这个空间有很多选择。

于 2019-06-05T17:39:14.077 回答