我有一个场景,我们在源文件中有一个timestamp字段,并以文本格式和parquet格式加载到归档文件和托管表中。我们看到的区别是这两个表之间的值相差了5个小时。你知道这是你们拐杖碰到的还是cloudera的大麻烦吗?请告诉我。
ars1skjm1#
当您在配置单元中使用时间戳时,必须设置 convert_legacy_hive_parquet_utc_timestamps 全球地。Impala 将增加5个小时的时间戳,它将视为当地时间为 Impala 。最简单的解决方案是将字段类型更改为string或在您插入配置单元时减去5小时。这方面已经有很多问题了,看看吧。
convert_legacy_hive_parquet_utc_timestamps
unguejic2#
根据 impala 文档在这里, impala 默认情况下,数据采用utc时区。因为 Impala 并不认为 TIMESTAMP 如果值位于任何特定时区,则必须了解查询、插入或转换的数据的时区方面。为了与unix系统调用保持一致 TIMESTAMP 由 now() 函数表示系统时区中的本地时间,而不是utc。要以可移植的方式存储相对于当前时间的值,请转换 now() 使用 to_utc_timestamp() 功能优先。在使用hive时,您可能希望遵循文档中的建议,但请注意,解决方案会带来性能开销。为避免性能开销,建议您将配置单元日期保存为utc时区(如果可能)如果您有hive编写的数据文件 TIMESTAMP 值表示写入数据的主机的本地时区,这可能导致在由处理时产生不一致的结果 Impala . 为了避免兼容性问题或必须编写解决方法,可以指定以下一个或两个impalad启动标志:-use_local_tz_for_unix_timestamp_conversions=true -convert_legacy_hive_parquet_utc_timestamps=true 尽管 -convert_legacy_hive_parquet_utc_timestamps 默认情况下关闭,以避免性能开销,在实际情况下,在处理时将其打开 TIMESTAMP 配置单元编写的Parquet文件中的列,以避免意外行为。
impala
TIMESTAMP
now()
to_utc_timestamp()
Impala
-convert_legacy_hive_parquet_utc_timestamps=true
-convert_legacy_hive_parquet_utc_timestamps
2条答案
按热度按时间ars1skjm1#
当您在配置单元中使用时间戳时,必须设置
convert_legacy_hive_parquet_utc_timestamps
全球地。Impala 将增加5个小时的时间戳,它将视为当地时间为 Impala 。最简单的解决方案是将字段类型更改为string或在您插入配置单元时减去5小时。
这方面已经有很多问题了,看看吧。
unguejic2#
根据
impala
文档在这里,impala
默认情况下,数据采用utc时区。因为 Impala 并不认为
TIMESTAMP
如果值位于任何特定时区,则必须了解查询、插入或转换的数据的时区方面。为了与unix系统调用保持一致
TIMESTAMP
由now()
函数表示系统时区中的本地时间,而不是utc。要以可移植的方式存储相对于当前时间的值,请转换now()
使用to_utc_timestamp()
功能优先。在使用hive时,您可能希望遵循文档中的建议,但请注意,解决方案会带来性能开销。为避免性能开销,建议您将配置单元日期保存为utc时区(如果可能)
如果您有hive编写的数据文件
TIMESTAMP
值表示写入数据的主机的本地时区,这可能导致在由处理时产生不一致的结果Impala
. 为了避免兼容性问题或必须编写解决方法,可以指定以下一个或两个impalad启动标志:-use_local_tz_for_unix_timestamp_conversions=true
-convert_legacy_hive_parquet_utc_timestamps=true
尽管-convert_legacy_hive_parquet_utc_timestamps
默认情况下关闭,以避免性能开销,在实际情况下,在处理时将其打开TIMESTAMP
配置单元编写的Parquet文件中的列,以避免意外行为。