HDFS - 最后一个预期列之后的额外数据

Posted

技术标签:

【中文标题】HDFS - 最后一个预期列之后的额外数据【英文标题】:HDFS -extra data after last expected column 【发布时间】:2016-11-28 13:48:55 【问题描述】:

我们有源系统和目标系统。尝试使用 talend 工具将数据从 SQL Server 2012 导入 Pivotal Hadoop (PHD 3.0) 版本。

出现错误:

ERROR: extra data after last expected column  (seg0 slice1 datanode.domain.com:40000 pid=15035)
  Detail: External table pick_report_stg0, line 5472 of pxf://masternnode/path/to/hdfs?profile=HdfsTextSimple: "5472;2016-11-28 08:39:54.217;;2016-11-15 00:00:00.0;SAMPLES;0005525;MORGAN -EVENTS;254056;1;IHBL-NHO..."

我们尝试过

我们已将 BAD 行标识为 [hdfs@mdw ~]$ hdfs dfs -cat /path/to/hdfs|grep 3548

3548;2016-11-28 04:21:39.97;;2016-11-15 00:00:00.0;SAMPLES;0005525;MORGAN -EVENTS;254056;1;IHBL-NHO-13OZ-01;0;ROC NATION; NH;2016-11-15 00:00:00.0;2016-11-15 00:00:00.0;;2.0;11.99;SA;SC01;NH02;EA;1;F2;NEW PKG ONLY PLEASE!! BY NOON

外部表结构和格式子句

CREATE EXTERNAL TABLE schemaname.tablename
(
"ID" bigint,
  "time" timestamp without time zone,
  "ShipAddress4" character(40),
  "EntrySystemDate" timestamp without time zone,
  "CorpAcctName" character(40),
  "Customer" character(7),
  "CustomerName" character(30),
  "SalesOrder" character(6),
  "OrderStatus" character(1),
  "MStockCode" character(30),
  "ShipPostalCode" character(9),
  "CustomerPoNumber" character(30),
  "OrderDate" timestamp without time zone,
  "ReqShipDate" timestamp without time zone,
  "DateValue" timestamp without time zone,
  "MOrderQty" numeric(9,0),
  "MPrice" numeric(9,0),
  "CustomerClass" character(2),
  "ProductClass" character(4),
  "ProductGroup" character(10),
  "StockUom" character(3),
  "DispatchCount" integer,
  "MWarehouse" character(2),
  "AlphaValue" varchar(100)
)
 LOCATION (
    'pxf://path/to/hdfs?profile=HdfsTextSimple'
)
 FORMAT 'csv' (delimiter ';' null '' quote ';')
ENCODING 'UTF8';

发现:出现额外的分号,导致额外的数据。但我仍然无法提供正确的格式条款。请指导如何删除多余的数据列错误。

我应该使用什么格式子句。

对此的任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

如果将以下内容附加到外部表定义中,在 ENCODING 子句之后,它应该有助于解决由于此问题导致少量行失败的问题:

LOG ERRORS INTO my_err_table SEGMENT REJECT LIMIT 1 PERCENT;

以下是此语法的参考:http://gpdb.docs.pivotal.io/4320/ref_guide/sql_commands/CREATE_EXTERNAL_TABLE.html

【讨论】:

尝试将其作为一列读取,然后在 HAWQ 中使用正则表达式对其进行解析。 为了确保您的数据有正确的列数,您可以使用 pig 或 spark 来计算 ";"在每一行中。 我过去也遇到过类似的问题,从 SQL Server 到 HDFS 的传输中的数据更容易清理,如果您可以选择这样做。或者如 Sung 所说 - 使用 Pig 或 Spark 来计算/清理它。仅供参考,我使用 ',' 作为分隔符,并且必须从数据中删除 \u0000 \r \n \f 字符。我还注意到您正在使用';'作为引号字符,是故意的吗?从文档..我可以看到 QUOTE 指定 CSV 模式的引号字符。默认为双引号 (") 如果这个数据真的有一个额外的分号并且你的数据没有被引用,你就不能格式化这个数据。我没有看到你的坏话被引用。引用它的意思是如果你有';'数据中的字符,则必须使用引号字符引用列值 - 默认为双引号。因此,如果您有分号的数据值,例如some;thing 那么你的字段值应该是“some;thing” 注意包含分号的字段使用双引号引起来。你提到报价为';'这是不正确的,将其从定义中删除并使用 talend 用于引用分隔符的字符。 您说您想查看目标系统中的错误值 - 我不确定这是否可能 - 如果 PXF 遇到错误行,它将在错误表中输入一个条目并继续下一行。您的工作是转到错误表并执行必要的操作来修复错误的行。

以上是关于HDFS - 最后一个预期列之后的额外数据的主要内容,如果未能解决你的问题,请参考以下文章

Greenplum gpload - 最后一个错误:最后一个预期列之后的额外数据

最后一个预期列 CSV 之后的 Postgres 额外数据

Postgresql COPY CSV ERROR:最后一个预期列之后的额外数据

Postgres 在 SQL Server BCP 文件的最后一个预期列之后复制错误额外数据

Jquery 在 DOM .append .after 之后获取更新的表格元素

当 csv 文件被额外的列扩展时更新数据模型