SQL;在 hive/hue 中使用 sql 分割一个值

SQL; Split a value up using sql in hive/hue

需要一些关于将数字拆分为日期时间戳的建议,目前使用 Hue 查询配置单元数据库;

在 table 中,我有一列用于捕获记录的唯一引用。该值如下所示;

219872021081000741

其中包含一个日期和时间,我希望从中提取(使用 sql)date/time 并将其作为自己的一列。这是数字的细分:

根据加粗值从左到右是DD YYYY MM HHMM

21 987 2021 08 1000 741

正则表达式 [0-3]?[0-9]{1}$ref[2][0-9][0-9][0-9][0-1][0-9][0-2][ 0-9][0-5][0-9][0-9]{3}_"

使用 sql,我想评估数字然后创建一个列,然后将其格式化为 DD-MM-YY HHMM 作为时间戳。已经查看了一些帖子,并尝试了一些东西,但运气不佳。另一个关键点是 DD 并不总是 2 个值,例如,如果它是第一个,那么它将是 1 而不是 01。

正在尝试合并到下面。在此先感谢您的任何建议。

select *,
cast((UTC +(60*60*12)*1000)/1000 as TIMESTAMP) as `LocalTime`
from Table.Name
where 
   name rlike 'FieldValue.*'

更新:我以迂回的方式更新了 sql 来计算值。

这是更新 sql,只需要图 out/get 一些关于我现在如何确定如何使用新列 FieldCount 的指导,例如它是 17,然后是 substring(FieldValue ,1, 1) 从 1 日到 9 日给出任何内容。如果它是 18,则 substring(FieldValue ,1,2) 从第 10 个开始给出任何值。

select *,
    cast((utc+(60*60*12)*1000)/1000 as TIMESTAMP) as `LocalTime`,
    case
    when FieldValue REGEXP '^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$' then '17'
    when FieldValue REGEXP '^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$' then '17'
    end FieldCount,
    substring(FieldValue ,6,4) as Years,
    substring(FieldValue ,1,1) as Days,
    substring(FieldValue ,10,2) as Months,
    substring(FieldValue ,12,2) as Hours,
    substring(FieldValue ,14,2) as Minut 
    from table.name

新更新,我现在将其更改为根据情况分开。这基本上将值分离到单独的字段中。基于别名字段名称进行连接的任何想法?

select
AField,
cast((UTC+(60*60*12)*1000)/1000 as TIMESTAMP) as `LocalTime`,
case when length(AField) = 18 then substring(AField,1,2)  else substring(AField,1,1) end Days,
case when length(AField) = 18 then substring(AField,10,2) else substring(AField,9,2) end Months,
case when length(AField) = 18 then substring(AField,6,4) else substring(AField,5,4) end years,
case when length(AField) = 18 then substring(AField,12,2) else substring(caseid,11,2) end Hours,
case when length(AField) = 18 then substring(AField,14,2) else  substring(AField,13,2) end minutes
from table.name

Hive 中正确的时间戳字符串表示是 yyyy-MM-dd HH:mm:ss.S。 您不需要单独提取所有部分,然后连接以获得时间戳。使用 regexp_replace 您可以使用反向引用来构建正确的时间戳以捕获正则表达式中的组(在圆括号中)。

with mytable as(--test dataset, use your table instead
select stack(2,
'219872021081000741',
'19872021081000741'
) as AField
)

select
case when length(AField) = 18 
     then timestamp(regexp_replace(AField,'^(\d{2})\d{3}(\d{4})(\d{2})(\d{2})(\d{2})\d{3}$','-- ::00.0'))
     else timestamp(regexp_replace(AField,'^(\d)\d{3}(\d{4})(\d{2})(\d{2})(\d{2})\d{3}$','--0 ::00.0'))
end as result     
from mytable

结果:

result  
2021-08-21 10:00:00.0
2021-08-01 10:00:00.0

注意:timestamp()这里的构造是为了证明生成的字符串与时间戳数据类型兼容并且正在正确转换,如果您愿意,可以将其保留为字符串。