如何将时间戳转换为字符串(不更改时区)?

pkwftd7m  于 2021-06-26  发布在  Hive
关注(0)|答案(3)|浏览(416)

我有一些unix时间转换成时间戳 sparklyr 出于某些原因,我还需要将它们转换成字符串。
不幸的是,在转换为字符串的过程中 hive 转换为est(我的区域设置)。

df_new <- spark_read_parquet(sc, "/mypath/parquet_*",
                             overwrite = TRUE,
                             name = "df_new",
                             memory = FALSE,
                             options = list(mergeSchema = "true"))
> df_new %>%  
           mutate(unix_t = from_utc_timestamp(timestamp(t) ,'UTC'),
           date_str = date_format(unix_t, 'yyyy-MM-dd HH:mm:ss z'),
           date_alt = to_date(from_utc_timestamp(timestamp(t) ,'UTC'))) %>% 
    select(t, unix_t, date_str, date_alt) %>% head(5)

# Source:   lazy query [?? x 4]

# Database: spark_connection

            t unix_t              date_str                date_alt  
        <dbl> <dttm>              <chr>                   <date>    
1 1419547405. 2014-12-25 22:43:25 2014-12-25 17:43:25 EST 2014-12-25
2 1418469714. 2014-12-13 11:21:54 2014-12-13 06:21:54 EST 2014-12-13
3 1419126103. 2014-12-21 01:41:43 2014-12-20 20:41:43 EST 2014-12-20
4 1419389856. 2014-12-24 02:57:36 2014-12-23 21:57:36 EST 2014-12-23
5 1418271811. 2014-12-11 04:23:31 2014-12-10 23:23:31 EST 2014-12-10

你们都能看到 date_str 以及 date_alt 使用 EST 时区。我需要 UTC 在这里。我该怎么做?
谢谢!

cl25kdpy

cl25kdpy1#

尝试使用as.posixct()?

format(as.POSIXct(unix_t, origin = unix_t, tz = "UTC", usetz=TRUE),"%Y-%m-%d %H:mm:ss")

这将首先将unix时间戳转换为utc,然后格式化为所需的字符串。

ezykj2lf

ezykj2lf2#

从hive函数引用来看,date\u格式使用java的simpledateformat,我相信它总是默认为jvm时区,这解释了为什么它会将字符串转换为时区。
一种方法是检测时区并手动添加小时数以获得utc。
另一种选择是使用 lubridatespark_apply() :

sdf_len(sc, 1) %>%
  mutate(unix_t = from_utc_timestamp(timestamp(1522371003) , 'UDT')) %>%
  spark_apply(
    function(e) {
      dplyr::mutate(
        e,
        time_str = as.character(
          lubridate::with_tz(
            as.POSIXct(unix_t, origin="1970-01-01"),
            "GMT"
          )
        )
      )
    },
    columns = c("id", "unix_t", "time_str"))
mspsb9vt

mspsb9vt3#

有可能Sparkyr正在把时区转换成Hive函数。我会尝试将dataframe注册为一个表,并使用纯hql进行操作:

createOrReplaceTempView(df_new, "df_new")
result <- sql("select from_utc_timestamp(timestamp(t) ,'UTC'),
   cast(from_utc_timestamp(timestamp(t) ,'UTC') as STRING),
   cast(from_utc_timestamp(timestamp(t) ,'UTC') as DATE)
   from df_new")
head(result)

编辑
如果您不熟悉sql语言,可以从 df_new 像这样以逗号分隔的列表(并用 as )

select var1, var2, t,
   from_utc_timestamp(timestamp(t) ,'UTC') as unix_t,
   cast(from_utc_timestamp(timestamp(t) ,'UTC') as STRING) as date_str,
   cast(from_utc_timestamp(timestamp(t) ,'UTC') as DATE) as date_alt
   from df_new

还可以使用*表示数据框中的所有变量:

select *,
   from_utc_timestamp(timestamp(t) ,'UTC') as unix_t,
   cast(from_utc_timestamp(timestamp(t) ,'UTC') as STRING) as date_str,
   cast(from_utc_timestamp(timestamp(t) ,'UTC') as DATE) as date_alt
   from df_new

相关问题