我对大数据/hadoop生态系统还很陌生,并且注意到在各种技术中,日期并非总是以标准方式处理的。我计划使用带有avro和parquet文件格式的sqoop将来自oracle的数据摄取到hdfs上的配置单元表中。hive继续将我的日期导入bigint值,我更喜欢时间戳。我试过使用“--map column hive”覆盖。。。但它仍然不起作用。寻找处理这个用例日期的最佳方法的建议。
5fjcxozz1#
如果使用sqoop将rdbms数据转换为parquet,请小心解释date、datetime或timestamp列的任何结果值。基础值表示为parquet int64类型,在impala表中表示为bigint。parquet值表示以毫秒为单位的时间,而impala将bigint解释为以秒为单位的时间。因此,如果在以这种方式从sqoop导入的parquet表中有一个bigint列,那么在解释为timestamp类型时,将值除以1000。
目前,avro表不能包含timestamp列。如果需要在avro表中存储日期和时间值,作为一种解决方法,可以使用值的字符串表示形式,使用unix\u timestamp()函数将值转换为bigint,或者使用extract()函数为各个日期和时间字段创建单独的数字列。您还可以像这样使用配置单元查询来获得所需时间戳格式的结果。
FROM_UNIXTIME(CAST(SUBSTR(timestamp_column, 1,10) AS INT)) AS timestamp_column;
其他解决方法是使用导入数据 --query 在sqoop命令中,可以将列转换为时间戳格式。例子
--query
--query 'SELECT CAST (INSERTION_DATE AS TIMESTAMP) FROM tablename WHERE $CONDITIONS'
如果select查询有点长,可以使用配置文件缩短命令行调用的长度。这是参考资料
1条答案
按热度按时间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()函数为各个日期和时间字段创建单独的数字列。
您还可以像这样使用配置单元查询来获得所需时间戳格式的结果。
其他解决方法是使用导入数据
--query
在sqoop命令中,可以将列转换为时间戳格式。例子
如果select查询有点长,可以使用配置文件缩短命令行调用的长度。这是参考资料