NZLOAD 正在工作,而 Netezza 中的外部表因错误输入行数达到最大错误而失败

Posted

技术标签:

【中文标题】NZLOAD 正在工作,而 Netezza 中的外部表因错误输入行数达到最大错误而失败【英文标题】:NZLOAD is working while External Table in Netezza failing with count of bad input rows reached maxerrors 【发布时间】:2015-10-07 13:38:50 【问题描述】:

Netezza 外部表的间歇性问题。

外部表因系统本身生成的文件而失败(意味着外部表生成的文件不是来自其他来源)。但是我们尝试通过 nzload 实用程序将相同的文件加载到另一个表中,并且可以正常工作.这个问题并不一致,大部分时间都无法重现。

CREATE EXTERNAL TABLE SP_PORTFOLIO_EXT_DATA_6128_140
(
    CLIENT_ID INTEGER,
    CONFIG_ID INTEGER,
    SCENARIO_ID INTEGER,
    PORTFOLIO_ID INTEGER,
    PORTFOLIO_NAME CHARACTER VARYING(200),
    CUSTOM13 CHARACTER VARYING(600),
    CUSTOM12 CHARACTER VARYING(500),
    CUSTOM11 CHARACTER VARYING(500),
    CUSTOM10 CHARACTER VARYING(500),
    CUSTOM9 CHARACTER VARYING(500),
    CUSTOM8 CHARACTER VARYING(500),
    CUSTOM7 CHARACTER VARYING(500),
    CUSTOM6 CHARACTER VARYING(2000),
    CUSTOM3 CHARACTER VARYING(500),
    CUSTOM2 CHARACTER VARYING(3000),
    CUSTOM1 CHARACTER VARYING(500),
    CREATIVE CHARACTER VARYING(512),
    PLACEMENT CHARACTER VARYING(5000),
    IMPRESSIONS NUMERIC(38,0),
    CLICKS NUMERIC(38,0),
    CONVERSIONS INTEGER,
    TRUE_CONVERSIONS NUMERIC(38,6),
    OPTMETRIC NUMERIC(38,6),
    LASTAD_OPTMETRIC NUMERIC(38,6),
    CURRSPEND NUMERIC(38,6)
)
USING
(
    DATAOBJECT('/san5/Netezza/CAR/CAR_ZEUS/SPBU/test/SP_PORTFOLIO_EXT_DATA_6128_140.csv')
    DELIMITER 254
    ESCAPECHAR '/'
    TIMESTYLE '24HOUR'
    LOGDIR '/tmp'
    Y2BASE 2000
    ENCODING 'internal'
);

命令成功完成

select COUNT(*) from SP_PORTFOLIO_EXT_DATA_6128_140;
ERROR [HY000] ERROR:  External Table : count of bad input rows reached maxerrors limit

NZLOAD 方法

CREATE TABLE TEST_LOAD
(
    CLIENT_ID INTEGER,
    CONFIG_ID INTEGER,
    SCENARIO_ID INTEGER,
    PORTFOLIO_ID INTEGER,
    PORTFOLIO_NAME CHARACTER VARYING(200),
    CUSTOM13 CHARACTER VARYING(600),
    CUSTOM12 CHARACTER VARYING(500),
    CUSTOM11 CHARACTER VARYING(500),
    CUSTOM10 CHARACTER VARYING(500),
    CUSTOM9 CHARACTER VARYING(500),
    CUSTOM8 CHARACTER VARYING(500),
    CUSTOM7 CHARACTER VARYING(500),
    CUSTOM6 CHARACTER VARYING(2000),
    CUSTOM3 CHARACTER VARYING(500),
    CUSTOM2 CHARACTER VARYING(3000),
    CUSTOM1 CHARACTER VARYING(500),
    CREATIVE CHARACTER VARYING(512),
    PLACEMENT CHARACTER VARYING(5000),
    IMPRESSIONS NUMERIC(38,0),
    CLICKS NUMERIC(38,0),
    CONVERSIONS INTEGER,
    TRUE_CONVERSIONS NUMERIC(38,6),
    OPTMETRIC NUMERIC(38,6),
    LASTAD_OPTMETRIC NUMERIC(38,6),
    CURRSPEND NUMERIC(38,6)
)
DISTRIBUTE ON RANDOM;

# Loading data  from the same file using Nzload

nzload -host 10.200.29.30 -u xxxxx -pw xxxxx -db SPBU_REPORT_DB_TEST -t test_load -delim 254 -ctrlChars  -df /san5/Netezza/CAR/CAR_ZEUS/SPBU/test/SP_PORTFOLIO_EXT_DATA_6128_140.csv

Load session of table 'TEST_LOAD' completed successfully

[ja.prod@inet11026 ~]$ cat /san5/Netezza/CAR/CAR_ZEUS/SPBU/test/SP_PORTFOLIO_EXT_DATA_6128_140.csv|wc -l
191322

select count(*) from test_load;
191322

添加 nzlog

File Buffer Size (MB): 8                  Load Replay Region (MB): 0
  Encoding:              INTERNAL           Max errors:            1
  Skip records:          0                  Max rows:              0
  FillRecord:            No                 Truncate String:       No
  Escape Char:           '/'                Accept Control Chars:  No
  Allow CR in string:    No                 Ignore Zero:           No
  Quoted data:           NO                 Require Quotes:        No

  BoolStyle:             1_0                Decimal Delimiter:     '.'

  Disable NFC:           No
  Date Style:            YMD                Date Delim:            '-'
  Y2Base:                2000
  Time Style:            24HOUR             Time Delim:            ':'
  Time extra zeros:      No

Found bad records

bad #: input row #(byte offset to last char examined) [field #, declaration] diagnostic, "text consumed"[last char examined]
----------------------------------------------------------------------------------------------------------------------------
1: 25(184) [21, INT4] expected field delimiter or end of record, "0"[.]

Statistics

  number of records read:      25
  number of bad records:       1
  -------------------------------------------------
  number of records loaded:    0

  Elapsed Time (sec): 0.0

-----------------------------------------------------------------------------
Load completed at: 08-Oct-15 09:59:04 EDT

包含错误行的 .nzbad 数据(管道符号代表实际的分隔符以提高可读性):

140|1305|6128||NULL|SEO|SEO|test.com/vehicledetail/detail/632888199/overview|SEO|SEO|SEO|SEO Brand|SEO Brand|best Tracking|Google(Seo)|SEO|Impression Tracker|Unknown|0|1|0|0.000000|0.000000|0.000000|0.000000

【问题讨论】:

这里有两件事浮现在脑海。首先是您的外部表的 LOGDIR 为 /tmp。关于外部表加载失败的原因的答案在该目录中的 .nzlog 文件中。该信息对于调试您的问题至关重要。第二个是您对 nzload 使用的选项与使用外部表的选项不同。例如,您在 nzload 而不是 ext 表上使用 CtrlChars,您在外部表上使用 escapchar 而不是 nzload。分享您的 /tmp/SP_PORTFOLIO_EXT_DATA_6128_140.*.nzlog 是什么,我们可以帮助您进一步诊断。 感谢 ScottMcg 的回复。但这里的情况有点奇怪。这个外部表创建是通过 NZSQL 过程调用运行的,它在 99.9% 的时间内都没有失败。这个 6128 在文件名表示特定的场景名称,如果我们清除此文件并使用相同的转义字符重新创建具有 6128 个元数据的相同文件,并且所有外部表都不会失败。这就是为什么一开始我将问题告诉为间歇性的。无论如何我会分享按照你说的记录。干杯 【参考方案1】:

从 nzlog 我们可以看出第 25 行加载失败。具体来说,当它尝试加载第 21 列时,它遇到了一个不是整数的值。

日志显示它遇到了一个 0,然后是一个句点。所以数据可能有 0.0 或 0.1234 之类的东西,不能作为整数加载。

bad #: input row #(byte offset to last char examined) [field #, declaration] diagnostic, "text consumed"[last char examined]
----------------------------------------------------------------------------------------------------------------------------
1: 25(184) [21, INT4] expected field delimiter or end of record, "0"[.]

使用您提供的 .nzbad 数据(为了便于阅读,此处使用“|”而不是您的实际分隔符):

140|1305|6128||NULL|SEO|SEO|test.com/vehicledetail/detail/632888199/overview|SEO|SEO|SEO|SEO Brand|SEO Brand|best Tracking|Google(Seo)|SEO|Impression Tracker|Unknown|0|1|0|0.000000|0.000000|0.000000|0.000000

我在这里注意到的一件事是您有一个 varchar 字段,其中包含“/”。外部表和 nzload 方法之间的区别之一是外部表指定了 escapechar '/' 而 nzload 没有。

您会发现您的数据“test.com/vehicledetail/detail/632888199/overview”将被加载为“test.comvehicledetaildetail632888199overview”,因为“/”字符将被删除,因为它们本身并未转义(例如“/ /')。

如果“/”直接位于数据中的列分隔符之前,它将指示它将列分隔符视为数据的一部分,并认为数据中的第 22 列实际上是表中的第 21 列这将与我们在这里看到的相符。

【讨论】:

ScottMcG 该文件是由具有相同定义的系统由同一个外部表创建的,正如我解释的那样,大多数时候系统都在正常工作。 Badfile 如下,第 21 个元素为 0,应该正确加载 140�1305�6128�NULL�SEO�SEO�test.com/vehicledetail/detail/632888199/overview�SEO�SEO�SEO�SEO Brand�SEO Brand�best Tracking�Google(Seo) “SEO”印象跟踪器。未知。0�1�0�0.000000�0.000000�0.000000�0.000000。主要的疑问仍然是为什么 NZLOAD 可以正常运行 我听到你在说什么,但我们能弄清楚发生了什么的唯一方法就是遵循诊断路径。如果它间歇性地工作,则可能是文件的输出间歇性地运行,并且负载每次都在做同样的事情,但数据不同。让我们看看 nzbad,看看我们能看到什么。 [ja.prod@inet11026 log]$ cat SP_PORTFOLIO_EXT_DATA_6128_140.SPBU_REPORT_DB_TEST.nzbad 140�1305�6128��NULL�SEO�SEO�tests.com/vehicledetail/detail/632888199/overviewSEO�SEO�SEO�品牌�SEO Brand.best Tracking.Google(Seo).SEO.Impression Tracker.Unknown.0.1.0.0.000000.0.000000.0.000000.0.000000 [ja.prod@inet11026 log]$。这是可用的错误文件 如果这对您有用,请不要忘记将其标记为已回答 escapechar '\' 也不适用于我的数据集。如果是这种情况,最好避免使用该选项。如果我错了,请纠正我。【参考方案2】:

ScottMcG 正如你所说,我比较了由 Nzload 和 External 表生成的 nzlog 文件,发现转义字符是唯一的区别。所以我将那部分注释掉并再次尝试,一切正常。

CREATE EXTERNAL TABLE SP_PORTFOLIO_EXT_DATA_6128_140

( CLIENT_ID 整数, CONFIG_ID 整数, SCENARIO_ID 整数, PORTFOLIO_ID 整数, PORTFOLIO_NAME CHARACTER VARYING(200), CUSTOM13 字符变化(600), CUSTOM12 字符变化(500), CUSTOM11 字符变化(500), CUSTOM10 字符变化(500), CUSTOM9 字符变化(500), CUSTOM8 字符变化(500), CUSTOM7 字符变化(500), CUSTOM6 字符变化(2000), CUSTOM3 字符变化(500), CUSTOM2 字符变化(3000), CUSTOM1 字符变化(500), 创意角色变化(512), 放置字符变化(5000), 印象数(38,0), 点击数字(38,0), 转换整数, TRUE_CONVERSIONS NUMERIC(38,6), 光学数字(38,6), LASTAD_OPTMETRIC NUMERIC(38,6), CURRSPEND NUMERIC(38,6) ) 使用 ( DATAOBJECT('/san5/Netezza/CAR/CAR_ZEUS/SPBU/test/SP_PORTFOLIO_EXT_DATA_6128_140.csv') 分隔符 254 时间风格“24 小时” LOGDIR '/tmp' Y2BASE 2000 编码“内部” );

从 SP_PORTFOLIO_EXT_DATA_6128_140 中选择计数(*);

191322.

【讨论】:

【参考方案3】:

数据类型必须更改如下:CHARACTER VARYING 替换为 VARCHAR/NVARCHAR

CREATE TABLE TEST_LOAD
(
CLIENT_ID INTEGER,
CONFIG_ID INTEGER,
SCENARIO_ID INTEGER,
PORTFOLIO_ID INTEGER,
PORTFOLIO_NAME VARCHAR(200),
CUSTOM13 VARCHAR(600),
CUSTOM12 VARCHAR(500),
CUSTOM11 VARCHAR(500),
CUSTOM10 VARCHAR(500),
CUSTOM9 VARCHAR(500),
CUSTOM8 VARCHAR(500),
CUSTOM7 VARCHAR(500),
CUSTOM6 VARCHAR(2000),
CUSTOM3 VARCHAR(500),
CUSTOM2 VARCHAR(3000),
CUSTOM1 VARCHAR(500),
CREATIVE VARCHAR(512),
PLACEMENT VARCHAR(5000),
IMPRESSIONS NUMERIC(38,0),
CLICKS NUMERIC(38,0),
CONVERSIONS INTEGER,
TRUE_CONVERSIONS NUMERIC(38,6),
OPTMETRIC NUMERIC(38,6),
LASTAD_OPTMETRIC NUMERIC(38,6),
CURRSPEND NUMERIC(38,6)
)
DISTRIBUTE ON RANDOM;

【讨论】:

以上是关于NZLOAD 正在工作,而 Netezza 中的外部表因错误输入行数达到最大错误而失败的主要内容,如果未能解决你的问题,请参考以下文章

netezza nzload 与 isumeric 类似的功能?

在将 nzload 与 netezza 一起使用时,我们如何定义多个空值?

平面文件到 SSIS 中的 Netezza 加载

使用 nzload 上传具有两种不同日期格式的文件

将 Unicode 文本文件导入 netezza 表

nzload - 当第一列与表元素不匹配时,skiprows 不起作用