用户画像 | 标签数据存储之Elasticsearch真实应用

本文探讨了如何使用Elasticsearch作为用户画像标签数据的存储方案,以解决高效检索问题。Elasticsearch是一个分布式全文检索引擎,适合处理高并发的复杂查询。文中通过对比Elasticsearch与关系型数据库,介绍了Elasticsearch的基本概念,并分享了一个实际案例,展示如何将数据从Hive清洗并导入到Elasticsearch,以及如何在工程中确保数据同步的正确性。通过Elasticsearch,实现了用户人群计算和分析的秒级响应。
摘要由CSDN通过智能技术生成

本文已收录github:https://github.com/BigDataScholar/TheKingOfBigData,里面有大数据高频考点,Java一线大厂面试题资源,上百本免费电子书籍,作者亲绘大数据生态圈思维导图…持续更新,欢迎star!

前言

        上一篇文章已经为大家介绍了 HBase 在用户画像的标签数据存储中的具体应用场景,本篇我们来谈谈 Elasticsearch 的使用!

在这里插入图片描述

原著作者:赵宏田
来源:《用户画像方法论与工程化解决方案》


Elasticsearch存储

Elasticsearch简介

        Elasticsearch 是一个开源的分布式全文检索引擎,可以近乎实时地存储、检索数据。而且可扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。对于用户标签查询用户人群计算用户群多维透视分析这类对响应时间要求较高的场景,也可以考虑选用Elasticsearch进行存储。

        Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用 json 作为文档格式。为了更清晰地理解 Elasticsearch 查询的一些概念,将其和关系型数据库的类型进行对照。

Elasticsearch MySQL
index database 数据库
type table
document row
mapping column
GET http://… SELECT * FROM … 查询数据
PUT http://… UPDATE table SET… 插入数据

        在关系型数据库中查询数据时可通过选中数据库、表、行、列来定位所查找的内容,在Elasticsearch中通过索引(index)、类型(type)、文档(document)、字段来定位查找内容。一个Elasticsearch集群可以包括多个索引(数据库),也就是说,其中包含了很多类型(表),这些类型中包含了很多的文档(行),然后每个文档中又包含了很多的字段(列)。Elasticsearch的交互可以使用Java API,也可以使用 HTTPRESTful API方式。

应用场景

        在上一节的内容中,我们谈到基于 HBase 的存储方案并没有解决数据的 高效检索 问题。在实际应用中,经常有根据特定的几个字段进行组合后检索的应用场景,而 HBase 采用 rowkey 作为一级索引,不支持多条件查询,如果要对库里的非 rowkey 进行数据检索和查询,往往需要通过 MapReduce 等分布式框架进行计算,时间延迟上会比较高,难以同时满足用户对于复杂条件查询和高效率响应这两方面的需求

        为了既能支持对数据的高效查询,同时也能支持通过条件筛选进行复杂查询,需要在HBase上构建二级索引,以满足对应的需要。在本案中我们采用Elasticsearch存储 HBase 的索引信息,以支持复杂高效的查询功能。

        主要查询过程包括:

        1)在Elasticsearch中存放用于检索条件的数据,并将rowkey 也存储进去;

        2)使用Elasticsearch的 API 根据组合标签的条件查询出rowkey的集合;

        3)使用上一步得到的 rowkey 去HBase数据库查询对应的结果
在这里插入图片描述
        HBase存储数据的索引放在Elasticsearch中,实现了数据和索引的分离。在Elasticsearch中documentid是文档的唯一标识,在HBase中rowkey是记录的唯一标识。在工程实践中,两者可同时选用用户在平台上的唯一标识(如userid或deviceid)作为rowkey或documentid,进而解决 HBase 和 Elasticsearch 索引关联的问题。

        下面通过使用 Elasticsearch 解决用户人群计算和分析应用场景的案例来了解这一过程。

        对汇聚后的用户标签表dw.userprofile_userlabel_map_all中的数据进行清洗,过滤掉一些无效字符,达到导入Elasticsearch的条件,如图所示:

在这里插入图片描述
        然后将dw.userprofile_userlabel_map_all数据写入Elasticsearch 中,Scala代码如下:

object HiveDataToEs {
   

  def main(args: Array[String]): Unit = {
   

    val spark = SparkSession.builder()
      .AppName("EsData")
      .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
      .config("spark.dynamicAllocation.enabled"
  • 37
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 31
    评论
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大数据梦想家

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

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

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

打赏作者

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

抵扣说明:

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

余额充值