bounty将在5天后过期。回答此问题可获得+200的声誉奖励。Alexey正在寻找来自声誉良好的来源的答案。
我有一个非常基本的csv格式的新年日期,从1970-01-01 00:00:00到0000-01-01 00:00:00,我已经将它作为外部表test.ny(dt string)
提供给Hive。
在配置单元2中创建 parquet table时:
create table test.ny2 stored as parquet
as
select
dt,
unix_timestamp(dt||' 00:00:00') dt2,
cast(dt as timestamp) dt3
from test.ny --this is my csv
如果我set spark.sql.legacy.parquet.int96RebaseModeInRead=LEGACY
,我可以通过spark-sql访问它。所有dt 3值都正确读取为YYYY-01-01 00:00:00
但是,当我通过Hive 3访问同一个表时,在
dt dt2 dt3
1901-01-01 00:00:00 -2177461817 1901-01-01 00:00:00.000
1900-01-01 00:00:00 -2208999600 1899-12-31 23:30:17.000
这可以解释为在配置单元2中错误地应用了tzdb,并且在最后应用了另一个tzdb:
dt dt2 dt3
0003-01-01 00:00:00 -62072708400 0002-12-29 23:30:17.000
0002-01-01 00:00:00 -62104244400 0001-12-29 23:30:17.000
0001-01-01 00:00:00 -62135780400 0001-12-29 23:30:17.000
0000-01-01 00:00:00 -62167402800 0002-12-29 23:30:17.000
这还不是全部,当我在Hive 3.1.3中从头开始重新创建相同的表时:
create table test.ny3 stored as parquet
as
select
dt,
unix_timestamp(dt||' 00:00:00') dt2,
cast(dt as timestamp) dt3
from test.ny --this is my csv
当我在Hive中选择它时,我得到了第二个错误!
dt dt2 dt3
0003-01-01 00:00:00 -62072697600 0003-01-01 00:00:00.000
0002-01-01 00:00:00 -62104233600 0002-01-01 00:00:00.000
0001-01-01 00:00:00 -62135769600 0002-01-01 00:00:00.000
0000-01-01 00:00:00 -62167392000 0002-01-01 00:00:00.000
我也不能通过spark-sql选择我想要的数据,无论我使用什么模式,遗留(这是可以理解的):
dt dt2 dt3
0003-01-01 00:00:00 -62072697600 0003-01-03 00:29:43
0002-01-01 00:00:00 -62104233600 0002-01-03 00:29:43
0001-01-01 00:00:00 -62135769600 0001-01-03 00:29:43
0000-01-01 00:00:00 -62167392000 0001-01-03 00:29:43
或更正(它几乎是正确的):
dt dt2 dt3
0003-01-01 00:00:00 -62072697600 0003-01-01 00:00:00
0002-01-01 00:00:00 -62104233600 0002-01-01 00:00:00
0001-01-01 00:00:00 -62135769600 0001-01-01 00:00:00
0000-01-01 00:00:00 -62167392000 0001-01-01 00:00:00 --notice the year!
问题1:Hive 3为什么不能正确处理0000年和0001年的时间戳?
问题2:如何在同一个Spark会话中读取旧表(由Hive 2编写)和新表(由Hive 3编写)?
- 如何让Hive 3使用旧的日历和tzdb逻辑,以便可以在LEGACY模式下读取所有表,或者
- 我如何在Hive 3中修改Hive 2的表以使用新的日历和tzdb逻辑,这样我就可以在CORRECTED模式下读取Spark中的所有表了?
1条答案
按热度按时间irlmq6kh1#
Hive3不支持遗留时间戳,它只在4.* 版本中以某种方式引入