hive中的json串和map结构的取数区别

本文探讨了在Hive中处理JSON字符串与Map结构取数的不同方法。第一种方法是通过正则表达式暴力解析JSON字符串,虽然可行但操作复杂。第二种方法是利用UDF函数将JSON转换为Map<String, String>,简化操作。测试示例展示了如何将JSON字符串转换为Map并直接在查询中使用。需要注意,当JSON中的value为null时,转换后的Map会丢失相应键值对。" 60876148,5678498,自定义MJRefresh下拉刷新动画,"['iOS开发', 'Swift', 'UI设计', '动画效果', '刷新框架']
部署运行你感兴趣的模型镜像

hive中的json串和map结构的取数区别
hive中如果定义的是json串,那么取数据用这种处理:

 get_json_object(params,'$.user_id')
如果是map<string,string>结构,那么取数据这样处理
params['user_id']
那么我们想要统一将json串转成map结构,便于取数方便。这种怎么处理?

第一种方式就是暴力的解析字符串,用正则的方式匹配:

select 
    pt_day,
    uid,point,
    str_to_map(regexp_replace(regexp_replace(regexp_replace(extra_info,'\"',''),'\\{',''),'\\}',''), ',', ':') extra_info

from honeycomb_all_user_point_record
where 
    pt_day = '2018-11-16'

但是这种方式过于暴力,虽然能正确的解析数据,但是使用起来比较麻烦,过于繁琐。
第二种方式就是要用UDF来解决:
这是udf函数的实现,实际上就是将json直接转成Map<String, String> 的格式。

package com.bytedance.udf.game;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.TypeReference;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;

import java.util.HashMap;
import java.util.Map;

@Description(name = "json_to_map", value = "_FUNC_(jsonString) - Get Map<String,String> from give jsonString")
public class Json2MapUDF extends UDF {
    public Map<String, String> evaluate(String sourceMapString) {
        if (null == sourceMapString || sourceMapString.isEmpty()) return new HashMap<>();
        HashMap<String, String> retMap;
        try {
            retMap = JSON.parseObject(sourceMapString, new TypeReference<HashMap<String, String>>() {
            });
        } catch (JSONException e) {
            retMap = new HashMap<>();
        }
        return retMap;
    }
}

这是测试样例:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.TypeReference;

import java.util.HashMap;
import java.util.Map;

/**
 * @Auther: 
 * @Date: 2021/1/14 10:37
 * @Description:
 */
public class Json2Map {
    public static void main(String[] args) {
        String sourceMapString = "{\"user_unique_id\":\"123\",\"role_id\":\"2345\",\"guild_id\":456,\"hero_id\":3003,\"pieces_amount\":0,\"hero_level\":8,\"hero_star\":6,\"hero_power\":32434,\"hero_skill_info\":\"245345:2;\"}";
        HashMap<String, String> retMap = new HashMap<String, String>();
        try {
            retMap = JSON.parseObject(sourceMapString, new TypeReference<HashMap<String, String>>() {});
        }
        catch (JSONException e){

        }
        System.out.println(sourceMapString);
        System.out.println(retMap);
        for (Object obj : retMap.keySet()){
            System.out.println("key为:"+obj+",值为:"+retMap.get(obj));
        }
    }
}

平时使用的时候就可以直接将json串转成map的格式:

insert overwrite table db_test.tb_test_2 patition (p_date = '2021-01-01')
select 
    Json2MapUDF(params) as params
from
    db_test.tb_test
where 
    p_date = '2021-01-01'

那么在使用这张表的时候就可以直接

select
    params['role_id'] as role_id
form
    db_test.tb_test_2
where 
    p_date = '2021-01-01'

注意点:
json串转成map,当value的值为null时候,转成的map中这个key-value会丢失。这是正常的,取value的数据也是NULL。

您可能感兴趣的与本文相关的镜像

Langchain-Chatchat

Langchain-Chatchat

AI应用
Langchain

Langchain-Chatchat 是一个基于 ChatGLM 等大语言模型和 Langchain 应用框架实现的开源项目,旨在构建一个可以离线部署的本地知识库问答系统。它通过检索增强生成 (RAG) 的方法,让用户能够以自然语言与本地文件、数据库或搜索引擎进行交互,并支持多种大模型和向量数据库的集成,以及提供 WebUI 和 API 服务

### Hive 中将 JSON 据解析并转换为 Map 类型字段的方法 在 Hive 中,可以通过内置函 `from_json()` 将 JSON 字符解析为 `MAP` 类型。该方法适用于结构化或半结构化的 JSON 据,并将其映射为 Hive 支持的复杂据类型。例如,可以将键值对形式的 JSON 字符转换为 `MAP<STRING, STRING>` 或其他兼容的结构 [^1]。 以下是一个使用 `from_json()` 函JSON 字符转换为 `MAP` 类型的示例: ```sql SELECT from_json(data, 'MAP<STRING, STRING>') AS data_map FROM json_data; ``` 在这个查询中,`data` 是包含 JSON 字符的列名,而 `'MAP<STRING, STRING>'` 指定了目标 `MAP` 类型的键值的据类型。执行后,返回的结果将以 `MAP` 形式展示 [^1]。 对于更复杂的 JSON 结构,例如嵌套的 JSON 对象或者包含组的结构,可以结合 `get_json_object()` `explode()` 等函进行处理。例如,当需要从一个 JSON 组中提多个对象时,可使用 `get_json_object()` 获特定字段的值,再通过 `explode()` 展开组以生成多行记录 [^3]。 下面是一个处理 JSON 组并提其中字段的示例: ```sql SELECT col_id, get_json_object(json_item, '$.a') AS new_a FROM table_name LATERAL VIEW explode( split( regexp_replace( regexp_extract(json_str, '^\\[(.+)\\]$', 1), '}, {', '}¥@¥{' ), '¥@¥' ) ) any_name AS json_item WHERE condition = ''; ``` 在此查询中,`json_str` 表示原始 JSON 字段,通过 `regexp_extract()` 提组内容、`regexp_replace()` 替换分隔符、`split()` 分割字符以及 `explode()` 展开成多行据,最终使用 `get_json_object()` 提每个 JSON 元素中的具体字段 [^3]。 如果只需要解析单个 JSON 字段而不涉及组,可以直接使用 `get_json_object()` 或 `json_tuple()` 函。例如,使用 `get_json_object()` 解析 JSON 字段中的特定属性: ```sql SELECT a.timestamp, get_json_object(a.appevents, '$.eventid'), get_json_object(a.appenvets, '$.eventname') FROM log a; ``` 此查询从 `appevents` `appenvets` 字段中分别提 `eventid` `eventname` 的值 [^2]。 此外,`json_tuple()` 函可用于一次解析多个 JSON 字段,但不能使用 `$.` 语法来指定字段路径: ```sql SELECT json_tuple(json_string, 'key1', 'key2'); ``` 该方法返回多个字段的值,适用于简单 JSON 对象的快速解析 [^2]。 综上所述,Hive 提供了多种方式用于解析 JSON 据并将其转换为 `MAP` 类型或其他结构化格式。根据实际需求选择合适的函组合,可以高效地处理不同类型的 JSON 据 [^1]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值