如何将hive中字符串解析(字符串的连接、解析)

场景:(1)将表中的字段转化成json数组,合并列,然后再合并行。建测试表,1315 、11729为表中某字段的值分属于不同的行,123、456为另一字段的对应行数字。准备测试数据,样例如下:[{"c1":"1315","c2":"123"},{"c1":"11729","c2":"456"}]。(2)将上述样例解析为表中的字段值1315、123。

1.准备测试数据的方法:

1)用:连接

select concat_ws(':','c1',a) from b   

结果如下:

c1:1672
c1:5025
c1:12218

……

2)加上双引号

select concat(',',concat('\"','c1','\"'),':',concat('\"',a,'\"')) kv from b

结果如下:

"c1":"1672"
"c1":"5025"
"c1":"12218"

3)加[{

SELECT CONCAT('{[',CONCAT(CONCAT('\"','c1','\"'),':',CONCAT('\"',a,'\"')),',',CONCAT(CONCAT('\"','c2','\"'),':',CONCAT('\"',nvl(b,''),'\"')),']}') FROM c

结果如下:

{["c1":"1672","c2":"14227"]}
{["c1":"12473","c2":""]}

4)合并行(如果有多个字段,将多个字段group,需注意group的字段里面维度不同导致合并不出想要的结果)

SELECT
        id,
        CONCAT ('[',CONCAT_WS(',',collect_set(kw)),']') AS kw
       FROM
           (SELECT
              medal_id,
              CONCAT(
               '{'
               ,CONCAT(
                 CONCAT(CONCAT('\"', 'c1', '\"'),':',CONCAT('\"', a, '\"')),
                 ',',
                 CONCAT(CONCAT('\"', 'c2', '\"'),':',CONCAT('\"', nvl (b, ''),'\"')))
               ,'}') AS kw

           FROM   a    GROUP BY id;

结果如下:

[{"c1":"6233","c2":"6260"},{"c1":"6233","c2":"6264"}]

综上,测试数据准备完成。

2.解析json字符串:

存储的数据类型是string,方法如下:先把[去掉,然后把分隔符编程||,然后一行变多行。

1)去掉[用如下:   '^\\[(.+)\\]$',1),'\\}\\,\\{'   , 将分隔符改成|| 用如下: '\\}\\|\\|\\{',分别用正则表达式函数regexp_extract(str, regexp[, idx]) 

select regexp_replace(regexp_extract(dddd,'^\\[(.+)\\]$',1),'\\}\\,\\{', '\\}\\|\\|\\{') as kw from test_002;

结果如下:

{"c1":"12218","c2":""}
{"c1":"13314","c2":""}||{"c1":"9192","c2":""}

2)一行变多行

SELECT a.id,b.kws,c.first,c.second FROM 
     (SELECT id, split(regexp_replace(regexp_extract(dddd,'^\\[(.+)\\]$',1),'\\}\\,\\{', '\\}\\|\\|\\{'),'\\|\\|') AS kw  
     FROM test_002 )a
    LATERAL VIEW explode(a.kw)b AS kws       -----把一行变成多行
    LATERAL VIEW json_tuple(b.kws,'c1','c2') c AS c1,c2;     --------把c1,c2从字符串中解析出来。

结果如下:

100006    {"c1":"16","c2":"14"}    1672    14227
100006    {"c1":"473","c2":""}    473    

 

2.sql跑和在shell(或者hive -e)执行:hive -e 中执行转义字符\\改成\\\\,试验不可以,然后再修改转义字符\\\\\\,示例如下:

SELECT
    id,
    split (
      regexp_replace (
        regexp_extract(cate_condition, '^\\\\\\[(.+)\\\\\\]$', 1),
        '\\\\\\}\\\\\\,\\\\\\{','\\\\\\}\\\\\\|\\\\\\|\\\\\\{'
      ),
      '\\\\\\|\\\\\\|'
    ) AS kw

### 如何在 Hive 中将字符串转换为日期格式 #### 使用 `unix_timestamp` 和 `from_unixtime` 对于特定格式的字符串时间,在将其转换成日期类型之前,可以先利用 `unix_timestamp` 函数解析字符串到 Unix 时间戳(秒数),再通过 `from_unixtime` 转换成带格式的时间字符串。如果目标是得到标准的日期时间戳类型的列,则可以在最后一步使用 `CAST` 来完成最终转换。 例如,要处理形如 `'2023-12-4 4:45:12'` 的字符串并希望获得对应的日期对象: ```sql SELECT CAST(from_unixtime(unix_timestamp('2023-12-4 4:45:12', 'yyyy-MM-dd HH:mm:ss')) AS DATE); ``` 这段 SQL 表达式的含义是从给定模式串中提取出 UNIX 时间戳,接着用 `from_unixtime()` 把它变回人类可读的形式,而外层包裹着的 `CAST(...AS DATE)` 则负责确保结果被解释为目标数据类型——即日期型[^2]。 #### 直接应用 `date_format` 另外一种方式就是直接采用 `date_format` 函数来改变输入字符串的表现形式而不必经历中间步骤。不过需要注意的是,此方法适用于那些已经接近所需输出格式的情况;当源数据与期望的结果之间存在较大差异时,可能仍需借助前述两步走的方法来进行更精确控制。 比如想要简单调整年月日顺序: ```sql SELECT date_format('2016-08-16', 'yyyyMMdd'); -- 结果将是:20160816 ``` 这里展示了一个较为简单的例子,其中仅涉及到了重新排列已有组件的位置,并未涉及到跨字段的操作是复杂的时间运算[^4]。 #### 处理带有时区信息的时间字符串 针对包含时区偏移量的信息,像 `'2023-12-4 4:45:12 UTC+08:00'` 这样的情况,同样可以通过指定合适的模板参数让 `unix_timestamp` 正确识别这些附加细节,从而实现准确无误地转换过程[^1]。 ```sql SELECT CAST( from_unixtime( unix_timestamp('2023-12-4 4:45:12 UTC+08:00', 'yyyy-MM-dd HH:mm:ss Z') ) AS TIMESTAMP); ``` 上述查询语句中的 `'Z'` 占位符用于匹配任何有效的时区表示法,使得整个表达能够兼容更多样化的输入场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白学习指南

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值