Sqoop 1.99.3,导出到MySQL返回空表

时间:2016-11-29 12:52:14

标签: mysql datetime export hdfs sqoop

原始问题

我正在使用Sqoop 1.99.3,我正在尝试将文件从HDFS导出到包含DateTime字段的MySql。不幸的是,在执行作业后,目标表为空,并且没有错误消息/日志。

  • 这个版本的Sqoop 支持DateTime格式?
  • 此问题是否有解决方法?

csv行的一个例子:

  • 1,'name',2016-04-01 15:10:57,2016-05-31 05:00:59

为MySQL表创建语句:

CREATE TABLE `unit` (
  `id` int(11) NOT NULL AUTO_INCREMENT,  
  `name` varchar(50) NOT NULL,
  `u_save_date` datetime DEFAULT NULL,
  `c_save_time` datetime NOT NULL,
   PRIMARY KEY (`id`));

因为我被问到,这是我的代码。没有什么革命性的,从Sqoop 5分钟演示客户端Api指南(link)复制了修改过的参数(这里我粘贴了默认参数)。

代码适用于不包含日期时间格式的表。我也尝试通过sqoop shell导出(使用相同的参数),但目标表又是空的

Java代码:

String url = "http://localhost:12000/sqoop/";
SqoopClient client = new SqoopClient(url);
MJob newjob = client.newJob(1, org.apache.sqoop.model.MJob.Type.EXPORT);
MJobForms connectorForm = newjob.getConnectorPart();
MJobForms frameworkForm = newjob.getFrameworkPart();

newjob.setName("ExportJob");
connectorForm.getStringInput("table.schemaName").setValue("");
connectorForm.getStringInput("table.tableName").setValue("table");
connectorForm.getStringInput("table.columns").setValue("id,name");

frameworkForm.getStringInput("input.inputDirectory").setValue("/input");

frameworkForm.getIntegerInput("throttling.extractors").setValue(1);
frameworkForm.getIntegerInput("throttling.loaders").setValue(1);

Status status = client.createJob(newjob);
if(status.canProceed()) {
  System.out.println("New Job ID: "+ newjob.getPersistenceId());
} else {
  System.out.println("Check for status and forms error ");
}

printMessage(newjob.getConnectorPart().getForms());
printMessage(newjob.getFrameworkPart().getForms());

后续问题

好的,我已成功解决了这个问题。但是,现在我遇到了另一个表的相同问题(即使DateTime格式正确)。

csv行的一个例子:

  • 1, '名称', '名称','2016年5月11日 12时08分27' 秒, '3a99471d-6f42-445f-b651-4a557a0e5b97'

最后一列是Java生成的UUID,存储为char(36)。

1 个答案:

答案 0 :(得分:1)

我已经发现了datetime字段的问题。日期时间应该用单引号(''),f括起来。 E:

  • 1,'name','2016-04-01 15:10:57','2016-05-31 05:00:59'