对数据加载进行故障排除
加载数据时,可能会遇到以下问题。对于特定于外部表的问题,请参阅外部表故障排除。
无法加载数据,因为所有列都是复杂类型
原生表必须至少包含一个列,该列是标量类型或原生数组(标量类型的一维数组)。如果要加载的数据完全由复杂类型组成,则必须在加载数据之前向表中添加标量列。您无需填充标量列。
首先,使用数据中的列以及一个标量列来创建原生表,然后将数据加载到该表中,如以下示例所示:
-- Native table with extra scalar column:
=> CREATE TABLE customers(person ROW(name VARCHAR, card VARCHAR), tempval int);
CREATE TABLE
-- Load complex data, ignoring scalar column:
=> COPY customers(person) FROM :custdata PARQUET;
Rows Loaded
-------------
3
(1 row)
加载因磁盘配额问题而失败
如果加载的数据量导致表或架构超过磁盘配额,则 COPY 可能会失败:
ERROR 0: Disk Quota for the Table Level Exceeded
HINT: Delete data and PURGE or increase disk quota at the table level
默认情况下,Vertica 表和架构没有磁盘配额;它们仅受您的硬件和许可证容量的限制。但是,超级用户可以设置配额,如磁盘配额中所述。
如果因配额问题而导致失败,则不能简单地使用 DELETE 来减少使用量。DELETE 不会释放空间,因为已删除的数据仍保留在存储容器中。要回收空间,您必须清除已删除的数据;请参阅移除表数据。
从 Parquet 文件读取数据时报告意料之外的数据类型不匹配
如果 Parquet 文件包含类型为 STRING 的列,但 Vertica 中的列属于不同的类型(如 INTEGER),您可能会看到不明确的错误消息。在这种情况下,Vertica 会将 Parquet 文件中的列报告为 BYTE_ARRAY,如以下示例所示:
ERROR 7247: Datatype mismatch: column 2 in the parquet_cpp source
[/tmp/nation.0.parquet] has type BYTE_ARRAY, expected int
这种行为特定于 Parquet 文件;对于 ORC 文件,该类型将被正确报告为 STRING。发生此问题的原因是,Parquet 文件不为 STRING 类型提供原生支持,而是用 BYTE_ARRAY 代表字符串。由于 Parquet 文件将其类型报告为 BYTE_ARRAY,Vertica 无法确定该类型实际为 BYTE_ARRAY 还是 STRING。
错误 7087:列数错误
加载 ORC 或 Parquet 数据时,您可能会看到表明列数出错的错误消息:
=> CREATE TABLE nation (nationkey bigint, name varchar(500),
regionkey bigint, comment varchar(500));
CREATE TABLE
=> COPY nation from :orc_dir ORC;
ERROR 7087: Attempt to load 4 columns from an orc source
[/tmp/orc_glob/test.orc] that has 9 columns
当您从 ORC 或 Parquet 文件加载数据时,您的表必须使用文件中的所有数据,否则就会生成此错误。为了避免此问题,请将缺失的列添加到表定义。
对于 Parquet 数据,时间戳值中的时区不正确
在 Vertica 中从 Parquet 文件读取时间戳可能会导致不同的值,具体取决于本地时区。发生此问题的原因是 Parquet 格式不支持 SQL TIMESTAMP 数据类型。如果您在表中使用 TIMESTAMP 数据类型定义列,Vertica 将从 Parquet 文件读取的时间戳解释为本地时区中的值。Hive 中也会发生相同的行为。发生这种情况时,Vertica 将在查询时生成如下警告:
WARNING 0: SQL TIMESTAMPTZ is more appropriate for Parquet TIMESTAMP
because values are stored in UTC
在 Vertica 中创建表时,使用 TIMESTAMPTZ 数据类型代替 TIMESTAMP 即可避免此问题。
ORC 数据中的时区也可能不正确,但原因不同。
对于 ORC 数据,时间戳值中的时区不正确
Vertica 和 Hive 都使用 Apache ORC 库与 ORC 数据进行交互。此库的行为随着 Hive 版本 1.2.0 而改变,因此时间戳表示取决于用于写入数据的版本。
写入时间戳时,ORC 库现在会在条带页脚中记录时区。Vertica 会查找此值并在加载时间戳时应用该值。如果文件是用早期版本的库编写的,则文件中缺少时区。
如果文件不包含时区,Vertica 将使用本地时区并在 QUERY_EVENTS 系统表中记录 ORC_FILE_INFO 事件。
首次查询新的 ORC 数据源时,应查询此表以查找缺失的时区信息:
=> SELECT event_category, event_type, event_description, operator_name, event_details, COUNT(event_type)
AS COUNT FROM QUERY_EVENTS WHERE event_type ILIKE 'ORC_FILE_INFO'
GROUP BY event_category, event_type, event_description, operator_name, event_details
ORDER BY event_details;
event_category | event_type | event_description | operator_name | event_details | count
----------------+---------------+----------------------------------------------------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+-------
EXECUTION | ORC_FILE_INFO | ORC file does not have writer timezone information | OrcParser | Timestamp values in the ORC source [data/sales_stats.orc] will be computed using local timezone | 2
(1 row)
Parquet 数据中的时区也可能不正确,但原因不同。
某些 DATE 和 TIMESTAMP 值存在几天的误差
当 Hive 写入 ORC 或 Parquet 文件时,它会将 1583 年以前的日期从公历转换成儒略历。Vertica 不会执行此转换。如果文件包含早于此时间的日期,则 Hive 中的值和 Vertica 中的相应值可能会相差多达十天。这种差异同时适用于 DATE 和 TIMESTAMP 值。