在不知道列顺序的情况下通过 Polybase 摄取 CSV 文件
Posted
技术标签:
【中文标题】在不知道列顺序的情况下通过 Polybase 摄取 CSV 文件【英文标题】:Ingesting a CSV file thru Polybase without knowing the sequence of columns 【发布时间】:2020-08-22 17:44:45 【问题描述】:我正在尝试使用 Polybase 将一些 CSV 文件从 Azure Data Lake 摄取到 Azure Synapse。 每个 CSV 文件中有一组固定的列,列名在第一行给出。但是,这些列可以以不同的顺序出现。
在 Polybase 中,我需要声明外部表,我需要在设计时知道列的确切顺序,因此我无法创建外部表。还有其他方法可以提取 CSV 文件吗?
【问题讨论】:
【参考方案1】:我不相信您可以直接使用 Polybase 执行此操作,因为正如您所指出的,CREATE EXTERNAL TABLE 语句需要列声明。然后在运行时将 CSV 数据映射到这些列名。
通过允许数据流生成表,您可以使用 Azure 数据工厂和数据流(它在后台使用 Polybase 将数据移动到 Synapse)轻松完成此操作。之所以可行,是因为该表是在读取数据之后生成的,而不是在 EXTERNAL 之前生成的。
对于接收器数据集,使用参数化的表名 [和可选的模式] 创建它:
在 Sink 活动中,指定“重新创建表”:
将所需的表名从管道传递给接收器数据集:
请注意,所有基于字符串的列都将定义为 VARCHAR(MAX)。
【讨论】:
谢谢乔尔。我可以知道这个解决方案实际上是在什么时候创建列吗?我将收到一个 CSV 文件,第一行显示我的列名,但顺序未知。 Sink 将使用它找到的任何列创建表 - 列的序号位置无关紧要。 如果 Sink 动态创建表,它如何知道哪一列使用了哪种数据类型? 它从数据流中的列类型推断。如果都是字符串,可以在 Sink 之前使用 Derived Column 将它们转换为所需的类型。正如我在回答中所指出的,所有 String 列最终都将作为 VARCHAR(MAX)。 谢谢乔尔,我可能会采用这个解决方案,而不是依赖于创建外部表以上是关于在不知道列顺序的情况下通过 Polybase 摄取 CSV 文件的主要内容,如果未能解决你的问题,请参考以下文章