waterdrop(1.5.1版本)增加bitmap类型导数的遇到的问题

Posted wuxizhi777

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了waterdrop(1.5.1版本)增加bitmap类型导数的遇到的问题相关的知识,希望对你有一定的参考价值。

1. 背景

背景是想通过最新的 jbdc 来使waterdrop 可以导入bitmap 类型的数据

2. 实施方法

a. 配置文件 adm_dmp_clickhouse_jdbc.conf

  spark 
  # Waterdrop defined streaming batch duration in seconds
  spark.streaming.batchDuration = 5
  spark.sql.catalogImplementation = "hive"
  spark.app.name = "dmp#tranadm.adm_user_id_dist_pre"
  spark.ui.port = 13000
  spark.dynamicAllocation.enabled=false
  spark.executor.instances = 9
  spark.executor.cores = 4
  spark.executor.memory = "28g"
  spark.default.parallelism=72
  spark.sql.shuffle.partitions=72
  spark.dynamicAllocation.enabled=false


input 
  hive 
    pre_sql = "select  'code' as code , label_value as value , from_unixtime(unix_timestamp(dt,'yyyyMMdd'),'yyyy-MM-dd') as dt , cast('123456' AS LONG) , collect_list(cast(id as int)) as id_bitmap  from  tranadm.adm_audc_user_base_label_string_inner_pro where dt='20221228' and label_name='country' and label_value is not null group by label_value,dt"
    result_table_name = "adm_dmp_user_id_dist"
  


filter 


output 
  clickhousebitmap 
    save_mode = "overwrite"
    host = ""$clickhouse_urls""
    clickhouse.socket_timeout = 100000
    database = ""$desc_ck_db""
    table = ""$desc_ck_table""
    fields =   ["code","value","dt","version","id_bitmap"]
    username = ""
    password = ""
    bulk_size = 5000000
  

b. 代码具体逻辑

collect_list 这个里面存放的是 spark 中arraylist [string] 类型的数据

      /**
   * 将数组转换成bitmap
   */
  private def getBitMapById(list_id: mutable.WrappedArray[Int]): RoaringBitmap = 
    if (list_id.length == 0) 
      new RoaringBitmap()
     else 
      var startBitMap = RoaringBitmap.bitmapOf(list_id(0))
      if (list_id.length > 1) 
        for (i <- 1 to list_id.length - 1) 
          startBitMap.add(list_id(i))
        
      
      startBitMap
    
  
   private def renderBaseTypeStatement(
    index: Int,
    fieldIndex: Int,
    fieldType: String,
    item: Row,
    statement: PreparedStatement): Unit = 
    fieldType match 
      case "DateTime" | "Date" | "String" =>
        statement.setString(index + 1, item.getAs[String](fieldIndex))
      case "Int8" | "UInt8" | "Int16" | "UInt16" | "Int32" =>
        statement.setInt(index + 1, item.getAs[Int](fieldIndex))
      case "UInt32" | "UInt64" | "Int64" =>
        statement.setLong(index + 1, item.getAs[Long](fieldIndex))
      case "Float32" => statement.setFloat(index + 1, item.getAs[Float](fieldIndex))
      case "Float64" => statement.setDouble(index + 1, item.getAs[Double](fieldIndex))
      case "Decimal" => statement.setBigDecimal(index + 1, item.getAs[BigDecimal](fieldIndex))
      case "AggregateFunction(groupBitmap, UInt32)" =>
         val value = item.getAs[mutable.WrappedArray[Int]](fieldIndex)
          val bitmap = getBitMapById(value)
          statement.setObject(index + 1, ClickHouseBitmap.wrap(bitmap, ClickHouseDataType.UInt32))
      case _ => statement.setString(index + 1, item.getAs[String](fieldIndex))
    
            

3. 遇到的问题

在新版本的jbdc 版本里面用到的是 0.9.10版本的 roaringbitmap

RoaringBitmap-0.9.10.jar

公司spark 集群是 2.4.6 其中 Roarbitmap 是低版本的;缺少高版本用到的方法。

在自己写jdbc spark 写ck 的时候用的是 spark 程序 config 的

--deploy-mode cluster \\

--conf spark.executor.userClassPathFirst=true \\

--conf spark.driver.userClassPathFirst=true \\

--jar /home/xizhi.wu/waterdrop_1_5_1/waterdrop-1.5.1/lib/RoaringBitmap-0.9.10.jar

这样的方式来使spark 程序优先用 高版本的roaringbitmap。

但在sbt 项目中始终没法通过。

以上是关于waterdrop(1.5.1版本)增加bitmap类型导数的遇到的问题的主要内容,如果未能解决你的问题,请参考以下文章

waterdrop1.5.1

WaterDrop

clickhouse使用waterdrop将Hive中的数据导入ClickHouse

iOS - 如何使用 Fastlane 增加版本号?

无法加载文件或程序集'WebGrease,版本 = 1.5.1.25624 - 或任何其他版本

如何增加语义版本号?