SQOOP导出到MySQL

时间:2018-07-28 13:35:06

标签: mysql apache hdfs sqoop sqoop2

试图将sqoopHDFS导出到MYSQL。由于输入文件与MySQL之间的日期格式不同,导致映射器错误。输入文件具有mm/dd/yyyy格式的数据,其中SQL是日期。我猜MySQLyyyy-mm-dd

由于同样的错误,所以:

  

原因:java.lang.RuntimeException:无法解析输入数据:'2/18/2019'

作为来源,我的限制来自其他提供商,我们无法要求他们更改它。那么在这种情况下我有什么选择呢?有什么建议

1 个答案:

答案 0 :(得分:0)

修改

很遗憾,此答案可能不适合您。如果您使用的程序无法控制源代码,则将无济于事。

我之所以将其保留下来,是因为这是我与rdbms编程新手共同看到的一个常见问题。

原始答案

为什么将日期和时间视为字符串?因此,为什么要为每一行构建SQL?在MySql方面,有一种更好的方法可以解决这个问题。

尽管不同供应商的实现方式有所不同,但大多数RDBMS都支持“预备语句”的概念。 Java已通过jdbc支持所有主要供应商的预准备语句,因此您无需担心实现细节。

每次执行SQL时,数据库引擎都会经过几个阶段,然后才应用或返回数据。第一个也是最耗时的阶段,称为“准备”阶段,是分析SQL字符串,并用计算机完成它的理想访问路径。在此“准备”阶段花费了50%到80%的SQL“执行”时间。

一个简单的优化是认识到成熟数据库中理想的访问路径很少变化,这使程序员可以准备一次语句,将句柄返回到访问路径,然后仅将句柄及其参数传递给整个网络。从应用程序到数据库。这样可以最大程度地减少访问路径计算,数据类型转换和网络通信的开销,同时自动防止SQL注入攻击,并照顾诸如日期格式之类的管理工作。

在Java中,这由PreparedStatement类表示。

始终使用准备好的语句。如果使用得当,它们将消除每个数据库调用的50%到80%的开销。它们还允许您通过使用本机Java类型并将值简单地通过PS传递到执行中来进行选择。

使用PreparedStatement也消除了许多清理输入的需求。从本质上讲,您不必担心特殊字符,除了目标会拒绝的特殊字符(例如:将可待因大于127的字符放入仅在强制执行字符集的平台上为ASCII构建的数据库中)。

如果您需要将输入作为String并转换为Date,请使用Java的DateFormat类。