INFER_EXTERNAL_TABLE_DDL
已弃用
此函数已弃用,并将在未来版本中移除。请改用 INFER_TABLE_DDL。检查 Parquet、ORC 或 Avro 格式的文件并返回可用于读取文件的 CREATE EXTERNAL TABLE AS COPY 语句。此语句可能不完整。它还可以包含更多列或名称长度超出 Vertica 支持范围的列;此函数不强制执行 Vertica 系统限制。使用它创建表之前,请始终检查输出并解决各类问题。
此函数支持 Parquet、ORC 和 Avro 格式的分区列,从输入路径推断。由于通过目录结构完成分区,所以可能不具备充足的信息来推断分区列的类型。在这种情况下,此函数显示这些列的数据类型为 UNKNOWN 并发出警告。
函数可处理大多数数据类型,包括复杂类型。如果 Vertica 不支持输入类型,则函数将发出警告。
默认情况下,函数对复杂类型使用强类型。您可以将 vertica_type_for_complex_type
参数设置为 LONG VARBINARY,将列视为灵活复杂类型。
这是元函数。您必须在顶级 SELECT 语句中调用元函数。
行为类型
易变语法
INFER_EXTERNAL_TABLE_DDL( path USING PARAMETERS param=value[,...] )
参数
- 路径
- 文件或目录的路径。任何对 COPY 有效并使用此函数支持的文件格式的路径都有效。
参数
format
- 输入格式(字符串),"Parquet"、"ORC" 或 "Avro" 之一。此参数为必填。
table_name
- 要创建的外部表的名称。此参数为必填。
不要将架构名称作为表名的一部分;使用
table_schema
参数。 table_schema
- 在其中创建外部表的架构。如果忽略,则函数的输出中不包含架构。
vertica_type_for_complex_type
- 用于表示所有复杂类型列的类型,如果不想完全展开的话。唯一支持的值为 LONG VARBINARY。有关详细信息,请参阅可变复杂类型。
特权
非超级用户:对于用户可访问的存储位置的读取权限。
示例
在下例中,输入文件包含具有两个整数列的表的数据。可以完全推断表定义,也可以按原样使用返回的 SQL 语句。
=> SELECT INFER_EXTERNAL_TABLE_DDL('/data/orders/*.orc'
USING PARAMETERS format = 'orc', table_name = 'orders');
INFER_EXTERNAL_TABLE_DDL
--------------------------------------------------------------------------------------------------
create external table "orders" (
"id" int,
"quantity" int
) as copy from '/data/orders/*.orc' orc;
(1 row)
要在架构中创建表,请使用 table_schema
参数。不要将其添加到表名中;函数将其视为带有句点的名称,而不是架构。
以下示例显示了复杂类型的输出。您可以按原样使用定义,也可以修改 VARCHAR 大小:
=> SELECT INFER_EXTERNAL_TABLE_DDL('/data/people/*.parquet'
USING PARAMETERS format = 'parquet', table_name = 'employees');
WARNING 9311: This generated statement contains one or more varchar/varbinary columns which default to length 80
INFER_EXTERNAL_TABLE_DDL
-------------------------------------------------------------------------
create external table "employees"(
"employeeID" int,
"personal" Row(
"name" varchar,
"address" Row(
"street" varchar,
"city" varchar,
"zipcode" int
),
"taxID" int
),
"department" varchar
) as copy from '/data/people/*.parquet' parquet;
(1 row)
在下例中,输入文件的 "prods" 列中包含映射。您可以将映射读取为行数组:
=> SELECT INFER_EXTERNAL_TABLE_DDL('/data/orders.parquet'
USING PARAMETERS format='parquet', table_name='orders');
WARNING 9311: This generated statement contains one or more varchar/varbinary columns which default to length 80
INFER_EXTERNAL_TABLE_DDL
------------------------------------------------------------------------
create external table "orders"(
"orderkey" int,
"custkey" int,
"prods" Array[Row(
"key" varchar,
"value" numeric(12,2)
)],
"orderdate" date
) as copy from '/data/orders.parquet' parquet;
(1 row)
在下例中,按区域对数据进行分区。函数无法推断数据类型,报告 UNKNOWN:
=> SELECT INFER_EXTERNAL_TABLE_DDL('/data/sales/*/*
USING PARAMETERS format = 'parquet', table_name = 'sales');
WARNING 9262: This generated statement is incomplete because of one or more unknown column types.
Fix these data types before creating the table
INFER_EXTERNAL_TABLE_DDL
------------------------------------------------------------------------
create external table "sales"(
"tx_id" int,
"date" date,
"region" UNKNOWN
) as copy from '/data/sales/*/*' PARTITION COLUMNS region parquet;
(1 row)
对于 VARCHAR 和 VARBINARY 列,此函数不指定长度。这些类型的 Vertica 默认长度为 80 字节。如果数据值较长,则使用这个未经修改的表定义可能会导致数据截断。始终查看 VARCHAR 和 VARBINARY 列,以确定是否需要指定长度。如果输入文件包含以下类型的列,则此函数将发出警告:
WARNING 9311: This generated statement contains one or more varchar/varbinary columns which default to length 80