背景

我正在使用 Azure 数据工厂 v2 将数据从本地数据库(例如 SQL Server)加载到 Azure 数据湖 gen2。由于我要加载数千个表,因此我创建了一个动态 ADF 管道,它根据架构、表名、修改日期(用于识别增量)等参数在源中按原样加载数据。这显然意味着我无法在 ADF 中手动指定任何类型的架构或映射。这很好,因为我希望数据湖以相同的结构保存源数据的持久副本。数据加载到 ORC 文件中。

基于这些 ORC 文件,我想在雪花中使用虚拟列创建外部表。我已经在 Snowflake 中创建了与源表具有相同列名和数据类型的普通表,我将在稍后阶段使用这些表。我想使用这些表的信息模式为外部表动态创建 DDL 语句。

问题

由于列名在 Snowflake 中总是大写,并且在很多方面都区分大小写,Snowflake 无法使用动态生成的 DDL 语句解析 ORC 文件,因为虚拟列的定义不再对应于源列名的大小写。例如,它将生成一个虚拟列 -> ID NUMBER AS(value:ID::NUMBER)

这将返回 NULL,因为该列在源数据库中以小写 D 命名为“Id”,因此也在数据湖的 ORC 文件中。

这感觉像是 Snowflake 的一个主要缺点。有什么合理的方法可以解决这个问题吗?我能想到的唯一选择是:
1. 将信息架构从源数据库单独加载到 Snowflake,并使用该数据构建具有正确大小写列名称的正确虚拟列定义。
2. 将整个记录加载到 Snowflake 中的某个变体列中,转换为 UPPER 或 LOWER。

这两个选项都增加了很多复杂性,甚至弄乱了数据。有没有什么直接的方法可以只从 ORC 文件中返回列名?最终,我需要能够在数据湖中的文件上使用类似 Snowflake 的 DESCRIBE TABLE 的东西。

最佳答案

除非你设置参数 QUOTED_IDENTIFIERS_IGNORE_CASE = TRUE 你可以在你想要的大小写中声明你的列:

CREATE TABLE "MyTable" ("Id" NUMBER);

如果您的动态 SQL 小心地使用 "Id" 而不仅仅是 Id,您会没事的。

关于snowflake-cloud-data-platform - 如何应对大数据文件格式和外部表中区分大小写的列名?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59268599/

10-16 01:56
查看更多