sqoop从postgresql导入到parquet / avro - timestamp epoch millis vs date type

时间:2017-04-11 15:32:56

标签: postgresql hadoop sqoop

好的,所以我可能稍微超载了标题,但我们正在使用sqoop 1.4.6.2.5.3.0-37(hdp 2.5.3)来提取数据。

当sqoop执行导入时间戳字段时,以毫秒为单位。

postgres架构

Column      |           Type           |                         Modifiers
------------------+--------------------------+------------------------------------------------------------
id               | integer                  | not null default nextval('foo'::regclass)
x      | integer                  |
y    | integer                  |
z | character varying(255)   |
created_at       | timestamp with time zone |
updated_at       | timestamp with time zone |

hive架构

id                      int
x           int
y           int
z       string
created_at              bigint
updated_at              bigint

如何让sqoop导入将时间戳字段视为镶木地板/ avro中的日期?

数据被配置为外部表,因此我们可以使用java / spark之类的东西直接命中它。我尝试了一些不同的字段映射(java),但到目前为止还没有实际保留类型

1 个答案:

答案 0 :(得分:0)

Sqoop为这个Postgres表创建一个POJO类。它将created_atupdated_at转换为Types.BIGINT

这就是为什么你在Hive中获得相应的BIGINT数据类型的原因。

在配置单元中,时间戳被解释为无时区。如果您尝试在hive的时间戳值中插入2016-02-23 14:00:21.426484-05,则会为此插入NULL

您所能做的就是在VARCHARSTRING

中转换这些列

尝试添加Java映射

--map-column-java created_at=String, updated_at=String

和hive mapping

--map-column-hive created_at=string, updated_at=string

--map-column-hive created_at='varchar(50)', updated_at='varchar(50)'

对于sqoop的默认java和hive映射检查:How sqoop converts sql datatypes into hive