草庐IT

database - RDBMS 时间戳与 Hive 时间戳时区不匹配

coder 2024-01-08 原文

如果我查询 RDBMS 以获取我收到的时间戳:2015-03-30 00:00:00 在我将它作为 bigint 列导出到 Hive 表后,我得到 1427673600000 (cast(ts as timestamp) gives 2015-03-30 02:00:00) 。即当前本地时区(带夏令时)已应用于时间戳。

如果我想与数据库中的内容保持一致,如何将导出的时间戳存储在 Hive 中?我是否需要始终将时间戳存储为 Hive 中的 UTC 格式,所以在这种情况下,我需要从我得到的时间中减去 2 小时 然后我必须在查询期间应用当前时区(使用 from_utc_timestamp)?
如何考虑夏令时(GMT+1 和 GMT+2)?

什么是最佳实践?

最佳答案

Hive 从 Unix 纪元开始以毫秒为单位存储时间戳。 Hive docs on timestamps它是“无时区”实际上是错误的,因为 Unix 纪元 根据定义 在 UTC 中。

您提供的时间戳 (1427673600000) 确实对应于 2015-03-30 00:00:00 UTC。如果这是您打算存储的即时时间,那么您的操作是正确的。如果实际上您打算只存储日历日期(指整个 日期,而不是该日期的午夜 UTC),那么您应该使用 DATE而是键入,仅存储 2015-03-30

你问为什么 cast(ts as timestamp) 给出 2015-03-30 02:00:00。这里可能发生的事情是,时间是用原始时间戳导出的,但是当你接收它时,它被加载到一个显示本地时间的类型中等价。

例如,java.util.Date 可能会发生这种情况。您应该能够使用 java.util.Calendar、Joda-Time 或新的 Java 8 java.time 类获取此值并进行不同的解释。如果您不使用 Java,那么类似的方法可能仍然适用。关键是,您可能正确使用了 Hive,但在您查看结果时引入了本地时区。

Do I need to always store timestamps as UTC format in Hive ...

是的,这是最佳实践,而这正是您已经在做的。

... so in this case I need to subtract 2 hours from what I got ...

不,您永远不应该从时间戳中手动添加或减去时间。这样做会使您处于一个完全不同的时间点。

... and then I have to apply the current timezone during querying (using from_utc_timestamp) ?

我对 Hive 不是很熟悉。看着the docs for from_utc_timestamp ,这似乎期望输入已经在时间戳中,但他们显示了一个使用字符串的示例。也许它也需要一个整数,但是你只需将 UTC 作为时区传递,实际上在值转换中什么都不做。您可能仍然会遇到同样的问题,尤其是当问题出在接收端时。恕我直言,我认为您不必使用它。

关于database - RDBMS 时间戳与 Hive 时间戳时区不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33217770/

有关database - RDBMS 时间戳与 Hive 时间戳时区不匹配的更多相关文章

  1. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  2. ruby - 匹配未转义的平衡定界符对 - 2

    如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。

  3. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  4. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  5. ruby-on-rails - 将 Ruby 中的日期/时间格式化为 YYYY-MM-DD HH :MM:SS - 2

    这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build

  6. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  7. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  8. ruby - rbenv 安装 ruby​​ 校验和不匹配 osx - 2

    我已经在mountainlion上成功安装了rbenv和ruby​​build。运行rbenvinstall1.9.3-p392结束于:校验和不匹配:ruby-1.9.3-p392.tar.gz(文件已损坏)预期f689a7b61379f83cbbed3c7077d83859,得到1cfc2ff433dbe80f8ff1a9dba2fd5636它正在下载的文件看起来没问题,如果我使用curl手动下载文件,我会得到同样不正确的校验和。有没有人遇到过这个?他们是如何解决的? 最佳答案 tl:博士;使用浏览器从http://ftp.rub

  9. ruby - 正则表达式将非英文字母匹配为非单词字符 - 2

    @raw_array[i]=~/[\W]/非常简单的正则表达式。当我用一些非拉丁字母(具体来说是俄语)尝试时,条件是错误的。我能用它做什么? 最佳答案 @raw_array[i]=~/[\p{L}]/使用西里尔字符进行测试。引用:http://www.regular-expressions.info/unicode.html#prop 关于ruby-正则表达式将非英文字母匹配为非单词字符,我们在StackOverflow上找到一个类似的问题: https://

  10. 微信小程序通过字典表匹配对应数据 - 2

    前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立

随机推荐