INFER_EXTERNAL_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