我是Azure数据仓库和Azure数据工厂V2的新手。
我有一个文件夹,在azure blob中有10个文件,每个文件都有不同的标题,但是所有文件中共有5个标题。
我尝试过的事情
创建10个链接到文件的服务器,并使用“复制数据”任务将数据移动到特定表。 但是我只需要这些表中的5列
问题
有什么办法可以让我拥有一个包含5列的表格和一个动态文件连接,以便从5个文件中加载数据。
示例: File1:10个标题 File2:11个标头 File3:7个标头 。 。 。 。 File10:15个标题
这些文件中共有5列,因此必须以5列的公共表装载数据。
答案 0 :(得分:1)
当您使用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
....
我可能不会使用Data Factory,因为Polybase可以为您完成大部分工作。
答案 1 :(得分:0)
您可以采用以下想法:
1。使用LookUp Activity来获取存储在特定的Azure Blob存储容器或其他路径中的fileName列表。请参阅此link。
2。使用ForEach Activity循环Lookup Activity [@activity('MyLookupActivity').output]
的输出。
3。在ForEach活动中,使用复制活动并将源Blob存储数据集路径配置为specific containerName/dynamic fileName
。(例如本例中的解决方案:when try to add dynamic file name (linked server) in azure data factory V2 error encountered)
答案 2 :(得分:0)
我同意@wBob的意见,Polybase可以为您解决这个问题。但是,作为替代方案,您可以使用Azure数据工厂数据流来处理所有文件并仅选择所需的5列,然后将这些结果输出到Blob接收器。然后将Blob用于Polybase,这将简化您的Polybase要求,或者使用ADF Copy活动将其写入SQLDW。这个空间有很多选择。