我正在尝试使用 Azure 数据工厂获取 csv 并将它们转换为 DW 中的 SQL 表。
列会经常更改,因此需要动态采用 csv 的架构。
我尝试使用 get 元数据来获取结构和数据类型,但我无法将其解析为相关格式以创建 sql 表。
有没有人在ADF上做过这样的事情?可能吗?
是的- 这需要一些配置,但可以使用 Azure 数据工厂数据流 (ADFDF( 完成此操作。
创建一个指向 CSV 位置的数据集(我假设是 Azure Blob 存储(。
- 最初,选择特定的 CSV 文件。
- 在架构选项卡上,单击"导入架构"。这在以后会更改是可以的,但数据集在设计时必须具有架构。
- 在"参数"选项卡上,为 blobName 创建一个参数。
- 在"连接"选项卡上,在"文件"框中引用该参数。您将在运行时在管道中设置其值。[这将覆盖用于定义架构的初始值]。
为 SQLDW 表创建数据集。
- 选择"创建新表">
- 添加架构和表名称[如果需要,以后应该可以通过数据集参数进行配置/覆盖]
- "架构"选项卡将不显示"架构"。
创建数据流以将数据从 CSV 移动到 SQLDW。
- 源:选择在步骤 1 中创建的数据集。
- 在"源设置"选项卡上:确保选中"允许架构偏移"并取消选中"验证架构" [这些是默认设置]。
- 选中"推断漂移列类型",这不是默认值。
- 接收器:选择在步骤 2 中创建的数据集。
- 在"接收器"选项卡上:确保选中"允许架构偏移",取消选中"验证架构" [这些是默认设置]。
- 在"设置"选项卡上,将"表操作"更改为"重新创建表"。这应该推断出新架构,并根据找到的内容删除和创建列。 在"映射">
- 选项卡上:确保启用"自动映射"[默认情况下应启用]
- 源:选择在步骤 1 中创建的数据集。
在管道中:
- 为"blobName"创建参数
- 选择数据流活动:
- 在"设置"选项卡上:将 blobName 的源参数设置为刚创建的管道参数。
- 特定于 SQLDW:需要为 Polybase 提供 Blob 存储链接服务和位置。
警告
- 据我所知,SQLDW 表中的每一列都创建为 NVARCHAR(MAX(。我认为"推断漂移列类型"会解决这个问题,但显然不是。
- 此配置假定 CSV 的第一行是标题行。
- 如果标题行中的传入列名包含空格或特殊字符,则 Sink 操作将失败。若要在生产方案中解决此问题,应在数据流中的源和接收器活动之间添加 SELECT,然后使用新的基于规则的映射和表达式去除任何无效字符。
- 我的示例每次都使用相同的 SQLDW 架构和表名,但如上面的步骤 2 所述,如果需要,您应该能够创建 DataSet 参数以在运行时覆盖这些参数。