在不知道列顺序的情况下通过 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 文件的主要内容,如果未能解决你的问题,请参考以下文章

在不破坏顺序的情况下对列进行分组

如何在不知道列类型的情况下获取列的值

在不知道进程启动顺序的情况下在另一个进程上触发事件

你知道如何在不改变其他元素顺序的情况下将元素移动到第一个位置吗?

如何在不知道 NA 值模式的情况下快速将列转换为数字

在不指定所有列名的情况下应用所有列?