当前位置: 首页 > 知识库问答 >
问题:

在增量更新中选择时间戳作为列时,Sqoop合并失败

羊时铭
2023-03-14

我想练习sqoop merge命令。我所做的是将数据从MySQL DB导入HDFS,然后用1个update和1个insert更新源表,我的表以id作为主键,时间作为时间戳。

接下来,我再次使用-增量=最后修改-检查列="时间"选项进行导入。

然后sqoop合并了,但失败了,出现了以下错误。我认为早期导入和最新导入的数据集之间存在一些不匹配,但无法理解问题所在。那是因为使用--Check-lie=time导入吗?如果我使用--where子句进行更新,它就有效了。

我用过:-

--Initial load
sqoop import \
  --connect "jdbc:mysql://quickstart.cloudera:3306/testdb" \
  --username=root \
  --password=cloudera \
  --table Customers \
  --as-textfile \
  --target-dir=/user/cloudera/sqoop_import/sqoop_merge/Customers

sqoop import \
  --connect "jdbc:mysql://quickstart.cloudera:3306/testdb" \
  --username=root \
  --password=cloudera \
  --table Customers \
  --as-textfile \
  --target-dir=/user/cloudera/sqoop_import/sqoop_merge/Customers_delta \
  --incremental lastmodified \
  --check-column "time" \
  --last-value '2016-08-24 22:04:56.0'

sqoop merge --merge-key department_id \
  --new-data /user/cloudera/sqoop_import/sqoop_merge/Customers_delta \
  --onto /user/cloudera/sqoop_import/sqoop_merge/Customers \
  --target-dir /user/cloudera/sqoop_import/sqoop_merge/Customers_merge \
  --class-name Customers \
  --jar-file /tmp/sqoop-cloudera/compile/d73387fb05f4fcb0d38725806fe52b30/Customers.jar

错误是:-

24年8月16日22:49:41 INFO mapreduce。作业:映射13%减少0%16/08/24 22:49:42信息映射减少。作业:任务Id:trunt\u 1471947772048\u 0032\u m\u00000 3\u 2,状态:FAILED Error:java。io。IOException:无法连接null键上的值。是否指定了存在的键列?在org。阿帕奇。sqoop。mapreduce。MergeMapperBase。processRecord(MergeMapperBase.java:79)位于org。阿帕奇。sqoop。mapreduce。合并文本映射器。地图(MergeTextMapper.java:58)位于org。阿帕奇。sqoop。mapreduce。合并文本映射器。地图(MergeTextMapper.java:34)位于org。阿帕奇。hadoop。mapreduce。映射器。在org上运行(Mapper.java:145)。阿帕奇。hadoop。映射。映射任务。在org上运行NewMapper(MapTask.java:764)。阿帕奇。hadoop。映射。映射任务。在org上运行(MapTask.java:340)。阿帕奇。hadoop。映射。YarnChild 2美元。在java上运行(YarnChild.java:167)。安全AccessController。javax上的doPrivileged(本机方法)。安全认证。主题DOA(Subject.java:415)位于org。阿帕奇。hadoop。安全用户组信息。doAs(UserGroupInformation.java:1554)位于org。阿帕奇。hadoop。映射。YarnChild。main(YarnChild.java:162)

任何找出原因的线索都会很有帮助。谢谢。

共有1个答案

贺刚毅
2023-03-14

您的表具有id主键字段。

在命令中使用“合并键id”。

根据您的错误日志,

无法连接null键上的值。是否指定了存在的键列?

您的表中似乎没有部门id字段。

 类似资料:
  • 问题内容: 如何从MongoDB集合中的时间(HH:MM:SS.Milisecond)值大于零的日期字段中选择记录,并通过保持日期的时间(HH:MM:SS)值为零来更新记录值是否与Python脚本中的现有值相同? 当前数据如下所示- 如何在Python脚本中仅选择第4、5、6和7行,并使用时间戳将其更新为零? 更新后,数据如下所示- 问题答案: 最好的方式来更新您的文件,并在时间使用日期时间模块,

  • 问题内容: 我在SO上看到过类似类型的问题,但是,我无法找到针对我特定问题的解决方案。(仅供参考,这些不是我的真实专栏,只是一个简短的示例)。 我有一个基本表: 因此,我想做的是能够: 我已经尝试过类似的东西: 但这不会返回我要查找的行。修复此查询的任何帮助都将非常有用。 非常感谢。 问题答案: 编辑: 顺便说一句,如果您想知道为什么原来的查询不起作用,让我们分解一下: 从…中选择一些东西 其中=

  • 我试图获得一个SQL语句来选择时间戳在两个给定时间戳之间的行。这是我试过的。(这是在Java servlet上,而我是Java时间戳对象。) 这里的from和to是timestamp对象这给了我一个语法错误,当我试图准备语句时,请帮助

  • 问题内容: 我需要将时间戳记值转换为查询中的纪元。请找到以下示例表和预期结果。 样表: 预期结果: 日志表的行数为n。请找到以下版本详细信息: 问题答案: 使用extract()函数: 显然,您的列不是timestamp列,而是a ,因此您首先需要将其转换为实际时间戳,然后才能使用 仅当该列中的所有值均具有正确的时间戳ISO格式时,此方法才起作用。 这告诉你,你应该 永远不要将日期,时间戳或时间值

  • 问题内容: 我在玩JPA(具体来说是Eclipselink)。下面的实体具有一个时间戳,应该在该实体上次更新时反映该时间戳。 每次更改此实体时,使JPA自动更新该时间戳的策略是什么? 如果我还想要一个“创建”时间戳记,该时间戳记仅在实体首次保留时设置,而永远不允许再次更改,该怎么办? 问题答案: 使用@PrePersist和@PreUpdate批注并编写您自己的事件侦听器。 详细了解一下此答案。它

  • 问题内容: 目前,我的表格中有一列存储日期和时间。该列的数据类型是 没有时区的时间戳 。因此它具有格式为的值。 我需要检索有关日期的行。如果我使用: 它将提供介于“ 2011-09-13 11:03:44.537”和“ 2011-09-12 11:03:44.537”之间的值。 但是,如果我要使用: 没有日期,月份和秒,它不显示任何行。 如何从此表中获取有关日期的值(仅包含日期,忽略小时,分钟和秒