oracle在hadoop中处理日期

2vuwiymt  于 2021-06-03  发布在  Sqoop
关注(0)|答案(1)|浏览(354)

我对大数据/hadoop生态系统还很陌生,并且注意到在各种技术中,日期并非总是以标准方式处理的。我计划使用带有avro和parquet文件格式的sqoop将来自oracle的数据摄取到hdfs上的配置单元表中。hive继续将我的日期导入bigint值,我更喜欢时间戳。我试过使用“--map column hive”覆盖。。。但它仍然不起作用。
寻找处理这个用例日期的最佳方法的建议。

5fjcxozz

5fjcxozz1#

Parquet文件格式

如果使用sqoop将rdbms数据转换为parquet,请小心解释date、datetime或timestamp列的任何结果值。基础值表示为parquet int64类型,在impala表中表示为bigint。parquet值表示以毫秒为单位的时间,而impala将bigint解释为以秒为单位的时间。因此,如果在以这种方式从sqoop导入的parquet表中有一个bigint列,那么在解释为timestamp类型时,将值除以1000。

avro文件格式

目前,avro表不能包含timestamp列。如果需要在avro表中存储日期和时间值,作为一种解决方法,可以使用值的字符串表示形式,使用unix\u timestamp()函数将值转换为bigint,或者使用extract()函数为各个日期和时间字段创建单独的数字列。
您还可以像这样使用配置单元查询来获得所需时间戳格式的结果。

FROM_UNIXTIME(CAST(SUBSTR(timestamp_column, 1,10) AS INT)) AS timestamp_column;

其他解决方法是使用导入数据 --query 在sqoop命令中,可以将列转换为时间戳格式。
例子

--query 'SELECT CAST (INSERTION_DATE AS TIMESTAMP) FROM tablename WHERE $CONDITIONS'

如果select查询有点长,可以使用配置文件缩短命令行调用的长度。这是参考资料

相关问题