【问题标题】:Sqoop export from hive to teradata does not work with timestamp field从 hive 到 teradata 的 Sqoop 导出不适用于时间戳字段
【发布时间】:2016-11-15 03:22:25
【问题描述】:

我正在尝试将具有一个字段作为时间戳 ('2016-05-21 02:00:00') 的文件从配置单元导出到 teradata。 teradata 中的数据类型是timestamp(0),可以期待类似的格式。

当我尝试使用 sqoop 导出它时,它会给出字符串到时间戳转换错误。 任何解决方法都会有很大帮助。

注意:

  • String 在 hive 到 Varchar(256) 在 teradata 工作。
  • 将 hive 中的 String 转换为 teradata 中的 timestamp(0) 失败。
  • 将 hive 中的 Timestamp 转换为 teradata 中的 timestamp(0) 失败。

日志:

16/07/12 12:24:20 INFO mapreduce.Job:  map 0% reduce 0%
16/07/12 12:24:27 INFO mapreduce.Job: Task Id : attempt_1467306662019_8607_m_000001_0, Status : FAILED
Error: java.lang.RuntimeException: Unparseable date: "2016-07-11 22:36:55"
    at com.teradata.connector.common.converter.ConnectorDataTypeConverter$StringFMTTZToTimestampTZ.convert(ConnectorDataTypeConverter.java:1679)
    at com.teradata.connector.teradata.converter.TeradataConverter.convert(TeradataConverter.java:143)
    at com.teradata.connector.common.ConnectorOutputFormat$ConnectorFileRecordWriter.write(ConnectorOutputFormat.java:106)
    at com.teradata.connector.common.ConnectorOutputFormat$ConnectorFileRecordWriter.write(ConnectorOutputFormat.java:65)
    at org.apache.hadoop.mapred.MapTask$NewDirectOutputCollector.write(MapTask.java:658)
    at org.apache.hadoop.mapreduce.task.TaskInputOutputContextImpl.write(TaskInputOutputContextImpl.java:89)
    at org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context.write(WrappedMapper.java:112)
    at com.teradata.connector.common.ConnectorMMapper.map(ConnectorMMapper.java:129)
    at com.teradata.connector.common.ConnectorMMapper.run(ConnectorMMapper.java:117)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:787)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:168)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:415)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1709)
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:162)

【问题讨论】:

  • 你的导出命令是什么?
  • sqoop 导出 -D mapred.job.queue.name=TestBatch -D mapred.output.compress=true -D mapred.output.compression.codec=org.apache.hadoop.io.compress。 SnappyCodec --connect jdbc:teradata://xxx.yy.zz.fff/Database=dev_stg --connection-manager org.apache.sqoop.teradata.TeradataConnManager --username test --password test --table dev_stg.bag - -export-dir "/dwh/data/event/bag/" --input-fields-terminated-by '\001' --null-string '\N' --null-non-string '\N'跨度>
  • hive 的时间戳到 teradata 的时间戳 (6) (这是默认值) 完美运行。能否以-verbose 重新运行命令以获取扩展日志?
  • 另外,你应该按照docs使用--input-null-string '\N' --input-null-non-string '\N'
  • 因此,在 hive 中,我应该将其作为时间戳字段,格式为“2016-07-11 12:00:00”,而在 teradata 中,我应该将时间戳定义为时间戳 (6)。是这个意思吗?

标签: hadoop hive teradata sqoop


【解决方案1】:

Teradata 列应采用“TIMESTAMP(0) WITH TIME ZONE”格式。它对我来说很好用。

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 2017-03-29
    • 1970-01-01
    • 2017-08-21
    • 2016-03-17
    • 1970-01-01
    • 2015-07-17
    • 2015-03-25
    • 1970-01-01
    相关资源
    最近更新 更多