【问题标题】:Handling dates in Hadoop在 Hadoop 中处理日期
【发布时间】:2017-04-23 16:03:50
【问题描述】:

我是大数据/Hadoop 生态系统的新手,并注意到并非总是以跨技术的标准方式处理日期。我计划使用 Sqoop 和 Avro 和 Parquet 文件格式将来自 Oracle 的数据摄取到 HDFS 上的 Hive 表中。 Hive 继续将我的日期导入 BIGINT 值,我更喜欢 TIMESTAMPS。我尝试使用“--map-column-hive”覆盖...但它仍然不起作用。

寻找有关此用例处理日期的最佳方式的建议。

【问题讨论】:

  • StackOverflow 不是收集有关问题的想法和建议的正确站点。请用具体的问题案例重述您的问题,说明您迄今为止所做的尝试以及您在此过程中遇到的问题。

标签: oracle date hive sqoop


【解决方案1】:

Parquet File Format

如果您使用 Sqoop 将 RDBMS 数据转换为 Parquet,请小心解释来自 DATE、DATETIME 或 TIMESTAMP 列的任何结果值。基础值表示为 Parquet INT64 类型,在 Impala 表中表示为 BIGINT。 Parquet 值以毫秒为单位表示时间,而 Impala 将 BIGINT 解释为以秒为单位的时间。因此,如果您在 Parquet 表中有一个从 Sqoop 以这种方式导入的 BIGINT 列,则在解释为 TIMESTAMP 类型时将值除以 1000。

Avro File Format

目前,Avro 表不能包含 TIMESTAMP 列。如果您需要在 Avro 表中存储日期和时间值,作为一种解决方法,您可以使用值的 STRING 表示,使用 UNIX_TIMESTAMP() 函数将值转换为 BIGINT,或者使用为单个日期和时间字段创建单独的数字列EXTRACT() 函数。

您也可以像这样使用 Hive 查询来获得所需 TIMESTAMP 格式的结果。

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

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

示例

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

如果您的 SELECT 查询有点长,您可以使用配置文件来缩短命令行调用的长度。这是reference

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    相关资源
    最近更新 更多