在 Hadoop 中处理日期
Handling dates in Hadoop
我是大 Data/Hadoop 生态系统的新手,我注意到日期并不总是以跨技术的标准方式处理。我计划使用带有 Avro 和 Parquet 文件格式的 Sqoop 将数据从 Oracle 提取到 HDFS 上的 Hive 表中。 Hive 继续将我的日期导入 BIGINT 值,我更喜欢 TIMESTAMPS。我试过使用“--map-column-hive”覆盖...但它仍然不起作用。
正在寻找有关处理此用例日期的最佳方式的建议。
Parquet File Format
如果您使用 Sqoop 将 RDBMS 数据转换为 Parquet,请小心解释 DATE、DATETIME 或 TIMESTAMP 列的任何结果值。底层值表示为 Parquet INT64 类型,在 Impala table 中表示为 BIGINT。 Parquet 值表示以毫秒为单位的时间,而 Impala 将 BIGINT 解释为以秒为单位的时间。因此,如果您在以这种方式从 Sqoop 导入的 Parquet table 中有 BIGINT 列,则在解释为 TIMESTAMP 类型时将值除以 1000。
Avro File Format
目前,Avro tables 不能包含 TIMESTAMP 列。如果您需要在 Avro tables 中存储日期和时间值,作为解决方法,您可以使用值的 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
我是大 Data/Hadoop 生态系统的新手,我注意到日期并不总是以跨技术的标准方式处理。我计划使用带有 Avro 和 Parquet 文件格式的 Sqoop 将数据从 Oracle 提取到 HDFS 上的 Hive 表中。 Hive 继续将我的日期导入 BIGINT 值,我更喜欢 TIMESTAMPS。我试过使用“--map-column-hive”覆盖...但它仍然不起作用。
正在寻找有关处理此用例日期的最佳方式的建议。
Parquet File Format
如果您使用 Sqoop 将 RDBMS 数据转换为 Parquet,请小心解释 DATE、DATETIME 或 TIMESTAMP 列的任何结果值。底层值表示为 Parquet INT64 类型,在 Impala table 中表示为 BIGINT。 Parquet 值表示以毫秒为单位的时间,而 Impala 将 BIGINT 解释为以秒为单位的时间。因此,如果您在以这种方式从 Sqoop 导入的 Parquet table 中有 BIGINT 列,则在解释为 TIMESTAMP 类型时将值除以 1000。
Avro File Format
目前,Avro tables 不能包含 TIMESTAMP 列。如果您需要在 Avro tables 中存储日期和时间值,作为解决方法,您可以使用值的 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