将数据插入 Greenplum 物理表

Posted

技术标签:

【中文标题】将数据插入 Greenplum 物理表【英文标题】:Inserting data into Greenplum Physical table 【发布时间】:2016-08-10 06:09:24 【问题描述】:

我正在尝试将数据从 Greenplum 外部表插入到物理(或普通表)表中。外部表指向一个包含大约 1.32 亿数据的配置单元文件。但是,当我的外部表只显示 6600 万时。结果,当插入物理表时,我只插入了 6600 万条记录。为什么会这样?与我的外部表的表属性有什么关系?如果有怎么办?

【问题讨论】:

请显示用于确定文件大小、表大小以及从文件到表的命令的命令。 您确定 Hive 表有 1.32 亿条记录吗?当 Hive 看到 count(*) 查询而不是实际计算行数时,Hive 将使用元数据来确定表中的行数。我会分析您的 Hive 表,然后再次执行 count(*) 以确保。 要寻找的另一件事是格式不正确的行。 Hive 将允许您将任何内容粘贴到表中而不会出现 GPDB 不会出现的错误。您也可以查看“坏”行。查看文档:gpdb.docs.pivotal.io/4380/admin_guide/load/topics/… @JonRoberts 感谢您的提示。看起来问题出在配置单元文件上。当我查询我的配置单元表时,它显示了 1.32 亿的计数,但是当在文件级别再次验证时,我可以看到 3600 万,这很奇怪。以下是我用来检查文件计数的命令。 hadoop fs -cat hdfs://DLDEVELOPMENT/data/wcdl/new/database_1/gpsample_table_test/* | wc -l 在 Hive 中,运行:“ANALYZE TABLE table_name COMPUTE STATISTICS FOR COLUMNS;”然后运行“SELECT COUNT(*) FROM table_name;”更新统计信息后,Hive 应显示正确的计数。 【参考方案1】:

当通过 hive 计算时,您会看到 6600 万条记录。假设你刚刚做了一个 count(*) 应该足够直截了当。

现在您对此并不满意,因为您有 1.32 亿“数据”,恰好是两倍。

我不会担心任何只允许您加载前 6600 万条记录的设置,所以让我们看看可能的嫌疑人。

    两个“数据”(行?)对应一个记录。 数据中有一些奇怪的东西,当您将其作为表格进行评估时,它会导致您遗漏一半的记录。 (可能在 6600 万行之后中断,可能是奇怪的行尾) 您实际上并未加载所有输入文件

仔细检查应该会指出真正的罪魁祸首。如果您不知道从哪里开始:

    查看文件中的第一行和最后几行,并将它们的完整内容与表中的第一条和最后几条记录进行比较 检查每个输入文件中的行是否在输出中表示 如果您确定某些数据丢失,请尝试推断输入文件中的哪一行应该丢失,并查看您是否可以在表中找到它。

【讨论】:

我不认为这是双数据的问题。对于具有 1 亿条数据的表,我面临同样的问题。当我尝试将具有 100 miliion 行的外部表中的数据插入到普通表中时。我看到只有 6600 万被插入。 @SriBharath 当您只尝试插入 10 个“数据”时会发生什么?如果你真的复制你的输入文件并尝试插入 2.64 亿会发生什么? 当我插入 10 时,我没有任何问题。同样,数据插入也适用于 1000 万条数据。任何大于 6600 万的数据量都不会被插入。 2.64亿数据也是如此。当我的文件被复制到 2.64 亿,并试图插入到我的外部表中时,我看到只有 6600 万插入。 @SriBharath 这很令人惊讶。根据您拆分和复制数据的方式,数据中仍有可能存在阻止加载的“奇怪”内容。假设您的表在读取后恰好有 N 行,您可以检查原始数据中的 N-1 到 N+2 行吗? -- 作为解决方法,您也许可以将数据拆分为少于 6600 万的部分,然后合并它们。或者您可以尝试使用 pig 将文件作为文本文件加载。 -- 值得一提的是:我之前使用过超过 66M 行的外部表,所以这至少不是一个简单的约束。 刚刚分析了我的配置单元文件。看起来这个文件有些问题。当我查询我的表时,它显示 1.32 亿,但是当使用 wc -l 选项查看文件时,我只能看到 3600 万。知道是什么导致了这种中断吗?【参考方案2】:

您的配置单元表是否已分区

【讨论】:

欢迎来到 Stack Overflow!这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时对自己的帖子发表评论,一旦您earn足够reputation,您就可以comment on any post。请阅读Why does this limit exist?【参考方案3】:

终于!问题似乎已解决。我继续对此进行研究,问题似乎是数据冗余。 (正如 dennis 在之前的回答中所建议的那样)。该表具有重复值(在所有列上重复)。每条记录都有另一组 11 条重复记录(尽管在我的情况下这是可以接受的)。为了避免冗余,我又添加了一个可以充当主键的列(自动生成的代理键)。现在,当我尝试从外部表加载 greenplum 物理表时,我可以看到插入的所有 1.32 亿条记录没有任何问题。

但是,尽管我的问题已解决,但为了进行更深入的分析,问题仍然是关于阈值(6600 万条记录)的问题。将在此发布一个新问题。

【讨论】:

以上是关于将数据插入 Greenplum 物理表的主要内容,如果未能解决你的问题,请参考以下文章

在 GreenPlum 中插入

如何识别Greenplum中的表是不是已更改?

GreenPlum/PostGreSQL表锁处理

Greenplum loader 不会将数据写入管道文件

Greenplum:查找任何外部表的关联错误表

Greenplum环境搭建 05GPSS扩展安装并使用GPKafka实现Kafka数据导入Greenplum数据库(安装包网盘分享)