• HIVE数据导入ES并避免字段空值占用空间


    方案一:hive正常表导入ES流程

    1、自己下载 elasticsearch-hadoop-6.6.0.jar依赖包,根据自己es版本选择,下载地址:

    https://www.elastic.co/pt/downloads/hadoop

    2、文件上传HDFS指定位置,我这边放在

    /user/hive/jars/elasticsearch-hadoop-6.6.0.jar;

    3、hive加载jar包 

    1. ADD JAR hdfs://uat01/user/hive/jars/elasticsearch-hadoop-6.6.0.jar;
    2. ADD JAR hdfs://uat01/user/hive/jars/commons-httpclient-3.1.jar;

    --注意,部分不加载“commons-httpclient-3.1.jar”可能会报错error in initSerDe: java.lang.NoClassDefFoundError org/apache/commons/httpclient,可以直接把包放在hive的lib下一样效果

    4、准备好数据,数据样例,其中email字段部分内容置为空模拟数据为空效果

     5、ES创建索引mapping

    1. PUT user_info
    2. {
    3. "mappings": {
    4. "user":{
    5. "properties": {
    6. "id":{
    7. "type": "long"
    8. },
    9. "name":{
    10. "type": "text"
    11. },
    12. "birthday":{
    13. "type": "text"
    14. },
    15. "email":{
    16. "type": "text"
    17. }
    18. }
    19. }
    20. }
    21. }

    6、建外部表

    1. drop table user_info_es;
    2. create external table user_info_es(
    3. id string,
    4. name string,
    5. birthday string,
    6. gender string,
    7. email string)
    8. STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
    9. TBLPROPERTIES(
    10. 'es.resource' = 'user_info/user', -- 索引名及type
    11. 'es.nodes'='192.168.139.101:9200', -- es地址
    12. 'es.mapping.id'='id' , -- 声明主键
    13. 'es.write.operation'='upsert', -- 声明更新
    14. 'es.index.refresh_interval' = '-1',
    15. 'es.index.number_of_replicas' = '0',
    16. 'es.batch.write.retry.count' = '6',
    17. 'es.batch.write.retry.wait' = '60s',
    18. 'es.mapping.name' = 'id:id,name:name,birthday:birthday,gender:gender,email:email' -- 字段映射
    19. );

    7、往外部表导入数据

    1. insert overwrite table user_info_es
    2. select id,name,birthday, gender,email from user_info_es_temp limit 100;

    8、查看ES数据,null数据仍占用字段,当表中null值很多,会占用较大空间,优化方案如下

     方案二:以JSON格式数据导入ES

    步骤1~5同上

    6、建外部表

    1. drop table user_info_es;
    2. create external table user_info_es(
    3. jsonString string
    4. )
    5. STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
    6. TBLPROPERTIES(
    7. 'es.resource' = 'user_info/user', -- 索引名及type
    8. 'es.nodes'='192.168.139.101:9200', -- es地址
    9. 'es.mapping.id'='id' , -- 声明主键
    10. 'es.write.operation'='upsert', -- 声明更新
    11. 'es.index.refresh_interval' = '-1',
    12. 'es.index.number_of_replicas' = '0',
    13. 'es.batch.write.retry.count' = '6',
    14. 'es.batch.write.retry.wait' = '600s',
    15. 'es.input.json' = 'yes' -- 必加 自动识别JSON
    16. );

    7、HIVE表数据加工成JSON

    1. -- concat会把value为空的数据,concat置为空
    2. -- 最后一个字段必须不含空值,或者使用concat_ws代替,否则会多个','逗号,导致JSON格式出现问题
    3. select concat_ws('', '{', id, birthday, gender, email, name, '}') jsonString
    4. from (select concat('\"id\":\"', id, '\",') id,
    5. concat('\"birthday\":\"', birthday, '\",') birthday,
    6. concat('\"gender\":\"', gender, '\",') gender,
    7. concat('\"email\":\"', email, '\",') email,
    8. concat('\"name\":\"', name, '\"') name
    9. from user_info_es_temp
    10. ) t;

    8、样例数据

    9、往外部表导入数据-导入前记得清空ES原数据,虽然是update,但email原本为null的更新不了

    1. insert overwrite table user_info_es
    2. -- concat会把value为空的数据,concat置为空
    3. -- 最后一个字段必须不含空值,或者使用concat_ws代替,否则会多个','逗号,导致JSON格式出现问题
    4. select concat_ws('', '{', id, birthday, gender, email, name, '}') jsonString
    5. from (select concat('\"id\":\"', id, '\",') id,
    6. concat('\"birthday\":\"', birthday, '\",') birthday,
    7. concat('\"gender\":\"', gender, '\",') gender,
    8. concat('\"email\":\"', email, '\",') email,
    9. concat('\"name\":\"', name, '\"') name
    10. from user_info_es_temp
    11. ) t;

    10、查看ES数据,email为空的已经不显示了 

    11、此操作对于update数据时可能存在风险,如原数据有值,需要更新为null,则此方式无法更新

  • 相关阅读:
    谁将主导未来AI市场?Claude3、Gemini、Sora与GPT-4的技术比拼
    爬虫工作者必备:使用爬虫IP轻松获得最强辅助
    使用机器学习进行客户终身价值和RFM模型分析
    java毕业设计成都某4S店销售管理系统Mybatis+系统+数据库+调试部署
    Linux常用命令
    藏宝计划TreasureProject(TPC)系统模式开发技术原理
    经典算法之折半查找法
    指针进阶---指针数组,数组指针
    一百六十九、Hadoop——Hadoop退出NameNode安全模式与查看磁盘空间详情(踩坑,附截图)
    算法训练第五十七天
  • 原文地址:https://blog.csdn.net/zcb_data/article/details/125901299