【用户行为归因分析项目】- 【企业级项目开发第三站】模拟DIM层设备、应用数据加载到Hive

gitee代码仓地址:DataWareHouse: UserBehaviorAttributionAnalysis​​​​​​

图方便两张维表就不建成分区表

企业中也应该是分区表,每天的行为数据关联每天组新的维表数据

第一次生成全量,有往里面继续增加设备和应用数据的功能

一、主方法

ProductionDimData 为应用起点

主方法调用的service:ProductDimData

Scala 复制代码
package com.dw.application

import com.dw.entity.{DimAppInfo, DimDeviceInfo}
import com.dw.service.ProductDimData

object ProductionDimData {
  //生产数据
  //五类数据需要生产,其中安装激活卸载数据是每日生产,应用信息和设备信息,在本次项目中设计为不更新


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

    //获取到dim数据(数组形式)之后加载到hive表中
    val dimData = new ProductDimData


    /**
     * 初始化设备信息和app信息,并加载到hive中
     */
   def initializeDimData(): Unit = {
      val appInfo: Array[DimAppInfo] = dimData.mockAppData()
      val deviceInfo: Array[DimDeviceInfo] = dimData.mockDeviceData(100)
      println(appInfo.mkString(";\n"))
      println(deviceInfo.mkString(";\n"))
      dimData.loadAppData(appInfo)
      dimData.loadDeviceData(deviceInfo)
    }

    /**
     * 增量添化设备信息并加载到hive中
     */
    def addDeviceData(): Unit = {
      //增加用户
      val addDeviceInfo: Array[DimDeviceInfo] = dimData.mockDeviceData(5)
      dimData.loadDeviceData(addDeviceInfo,"into")
    }

    /**
     * 增量添化应用信息并加载到hive中
     */
    def addAppData(): Unit = {
      //增加用户
      val addDeviceInfo: Array[DimDeviceInfo] = dimData.mockDeviceData(5)
      dimData.loadDeviceData(addDeviceInfo,"into")
    }

    initializeDimData()
    //addDeviceData()
  }
}

二、逻辑处理 ProductDimData

四个方法

mockDeviceData:模拟设备数据

mockAppData:模拟应用数据

loadAppData:将应用数据加载到hive表

loadDeviceData:将设备数据加载到hive表

Scala 复制代码
package com.dw.service

import com.dw.common.utils.ConfigUtil
import com.dw.config.DeviceAndAppInfoConfig.{appInfos, device_models}
import com.dw.dao.HiveSqlExecute
import com.dw.entity.{DimAppInfo, DimDeviceInfo}
import com.dw.util.RadomUtils

import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
import scala.collection.mutable.ArrayBuffer
import scala.util.Random

class ProductDimData {
  private val radomDeviceId = new RadomUtils
  private val dimHiveTableName = ConfigUtil.getHiveTableName.getConfig("dim")

  private val hiveSqlExecute = new HiveSqlExecute

  /**
   * 模拟生成设备信息
   * 据提前定制的DeviceAndAppInfoConfig配置类中的设备数据,生成设备id
   *
   * @param count 生成的数据条数
   * @return Array[DimDeviceInfo]
   */
  def mockDeviceData(count: Int): Array[DimDeviceInfo] = {
    //val deviceData:ArrayBuffer[DimDeviceInfo]=ArrayBuffer.empty
    val deviceData: ArrayBuffer[DimDeviceInfo] = ArrayBuffer()

    (1 to count).foreach(_ => {
      val device_model = device_models(Random.nextInt(device_models.length)).mkString(",")
      deviceData += DimDeviceInfo(
        radomDeviceId.RadomDeviceId(16),
        device_model.split(",")(0).mkString,
        device_model.split(",")(1).mkString,
        device_model.split(",")(2).mkString.toDouble
      )
    }
    )
    deviceData.toArray
  }

  /**
   * 模拟生成设备信息
   * 根据提前定制的DeviceAndAppInfoConfig配置类中的app数据,生成应用id
   *
   * @return Array[DimAppInfo]
   */
  def mockAppData(): Array[DimAppInfo] = {
    val dimAppInfo = ArrayBuffer[DimAppInfo]()
    appInfos.foreach(
      appinfo => {
        dimAppInfo += DimAppInfo(
          ("c" + Random.nextInt(99999) + 1).toString
          , appinfo(0)
          , appinfo(1)
        )
      }
    )
    dimAppInfo.toArray
  }


  /**
   * app数据加载到hive表中
   *
   * @param appInfo  生成的app相关数据
   * @param loadType 可选insert into还是insert overwrite(默认)
   * @return Array[DimAppInfo]
   */
  def loadAppData(appInfo: Array[DimAppInfo], loadType: String = "overwrite"): Unit = {

    val ValueSql = appInfo.map(appinfo => {
      s"('${appinfo.app_id}', '${appinfo.app_name}','${appinfo.app_category}','${LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))}')"
    }).mkString(",")

    val TABLE_NAME = dimHiveTableName.getString("dim_app_info")

    if (loadType.toLowerCase == "into")
      hiveSqlExecute.batchInsert(TABLE_NAME, ValueSql)
    else
      hiveSqlExecute.batchInsertOverWrite(TABLE_NAME, ValueSql)
  }

  /**
   * 设备数据加载到hive表中
   *
   * @param deviceInfo 生成的设备相关数据
   * @param loadType   可选insert into还是insert overwrite(默认)
   * @return Array[DimAppInfo]
   */
  def loadDeviceData(deviceInfo: Array[DimDeviceInfo], loadType: String = "overwrite"): Unit = {
    val ValueSql = deviceInfo.map(deviceinfo => {
      s"('${deviceinfo.device_id}', '${deviceinfo.device_model}','${deviceinfo.device_brand}','${deviceinfo.device_price}','${LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))}')"
    }).mkString(",")

    val TABLE_NAME = dimHiveTableName.getString("dim_device_info")
    if (loadType.toLowerCase == "into")
      hiveSqlExecute.batchInsert(TABLE_NAME, ValueSql)
    else
      hiveSqlExecute.batchInsertOverWrite(TABLE_NAME, ValueSql)
  }


}

三、app和设备的原始数据配置

DeviceAndAppInfoConfig

用来配置app和设备的相关无法自动生成的信息si

Scala 复制代码
package com.dw.config

object DeviceAndAppInfoConfig {

  val device_models = Array(
    Array("XIAOMI 17", "XIAOMI", 4799.0),
    Array("XIAOMI 17 Pro", "XIAOMI", 4999.0),
    Array("XIAOMI 17 ProMax", "XIAOMI", 5999.0),

    Array("Mate 80", "HUAWEI", 4699.0),
    Array("Mate 80 Pro", "HUAWEI", 5999.0),
    Array("Mate 80 ProMax", "HUAWEI", 7999.0),

    Array("iPhone 17", "HUAWEI", 5999.0),
    Array("iPhone 17 Pro", "HUAWEI", 8999.0),
    Array("iPhone 17 ProMax", "HUAWEI", 9999.0)
  )
  val appInfos = Array(
    Array("网易云", "音乐"), Array("QQ音乐", "音乐"), Array("汽水音乐", "音乐"),
    Array("QQ", "社交"), Array("微信", "社交"), Array("微博", "社交"),
    Array("腾讯视频", "视频"), Array("爱奇艺", "视频"), Array("优酷", "视频"),
    Array("招商银行", "理财"), Array("建设银行", "理财"), Array("兴业银行", "理财"),
    Array("高德地图", "地图导航"), Array("百度地图", "地图导航"), Array("Google地图", "地图导航"),
    Array("抖音", "短视频"), Array("快手", "短视频"), Array("内涵段子", "短视频"),
    Array("墨迹天气", "天气"), Array("中国气象", "天气"), Array("彩云天气", "天气"),
    Array("豆包", "AI"), Array("Deep Seek", "AI"), Array("千问", "AI"),
  )
}

四、功能验证

功能的验证我们在下一章模拟生成用户行为信息后统一展示

相关推荐
卷毛迷你猪17 小时前
快速实验篇(B06)页面单跳转化率
大数据·hive·hadoop
IT毕设梦工厂17 小时前
计算机毕业设计选题推荐:基于大数据的气象站地面观测数据分析与可视化|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·hadoop·信息可视化·数据挖掘·数据分析·课程设计·大数据毕设项目
卷毛迷你猪2 天前
快速实验篇(B02)DWD 生产级升级
大数据·hive·hadoop
卷毛迷你猪2 天前
快速实验篇(B03) 用户行为漏斗与转化率
大数据·hive·hadoop
卷毛迷你猪2 天前
快速实验篇(B01)用户行为日志画像与 DWD 标准化
大数据·hive·hadoop
卷毛迷你猪2 天前
快速实验篇(B04) 热门品类 Top10 与加权排名
大数据·hive·hadoop
Q26433650233 天前
【有源码】基于XGBoost的安卓应用市场数据分析与评分预测系统-面向应用市场的安卓App评分回归预测方法研究
大数据·hadoop·数据挖掘·数据分析·回归·spark·毕业设计
IT毕设梦工厂3 天前
计算机毕业设计选题推荐:基于大数据的培训机构信息分析与可视化|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·hadoop·mysql·数据挖掘·数据分析·spark·课程设计
IT毕设梦工厂3 天前
计算机毕业设计选题推荐:基于大数据的杭州亚运会社交媒体互动数据可视化分析|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·hadoop·信息可视化·数据挖掘·数据分析·课程设计·数据分析数据可视化
CarIise4 天前
Spring Boot整合MyBatis与文件上传:从分层架构到文件上传下载实战
数据仓库·hive·hadoop