實踐和感悟 - scala向下轉型和減少窮舉

来源:http://www.cnblogs.com/gnool/archive/2016/07/19/5668384.html

工作中的問題總結: 問題一:scala 之向下轉型 引言:假如在複雜的業務邏輯中,變數的類型不能確認,只能給個介面類型,這樣數據類型推導不會錯誤,但是後面要使用實現類的類型時,你卻發現轉不過來了? 對於這樣的一個問題,scala可以這樣解決: 首先建造一個介面,People: 這樣定義了一個介面,接 ...


工作中的問題總結:

問題一:scala 之向下轉型

引言:假如在複雜的業務邏輯中,變數的類型不能確認,只能給個介面類型,這樣數據類型推導不會錯誤,但是後面要使用實現類的類型時,你卻發現轉不過來了?

對於這樣的一個問題,scala可以這樣解決:

首先建造一個介面,People:

trait People {
  def toData[T](people:People):T
}

這樣定義了一個介面,接著我們實現他的實現類Students和Teacher:

class Students(name: String) extends People {
  var level:String="語文"
  
  override def toData[Students](people: People): Students = {
    people.asInstanceOf[Students]
  }

  def work() {
    println("學習")
  }
}
object Students {
  def apply(name: String): Students = {
    new Students(name)
  }
}
class Teacher(name: String, age: Int) extends People {

  var work: String = "hello"
  override def toData[Teacher](people: People): Teacher = {
    people.asInstanceOf[Teacher]
  }

  def teach() {
    println("teaching")
  }
}
object Teacher {
  def apply(name: String, age: Int): Teacher = {
    new Teacher(name, age)
  }
}

這樣我們的前奏做完了,接下來就測試向下轉型:

object Test {
  def main(args: Array[String]): Unit = {
    val a = ("tom", "1")
    val b = ("jim")
    val people:People = test(a)

    if (people != null) { 
      val peo:Teacher=people.toData[Teacher](people)
      println(peo.work)
      peo.teach()
    }
    
    val peo:People = test(b)

    if (peo != null) { 
      val p:Students=peo.toData[Students](peo)
      println(p.level)
      p.work()
    }

  }

  def test(x: Any): People = {
    val people = x match {
      case (name, age) => Teacher(name.toString(), age.toString().toInt)
      case (name)      => Students(name.toString())
      case _           => null
    }
    people
  }
}

執行結果

hello
teaching
語文
學習

成功轉型,這個解決方法是很有用的,工廠生產有很多模型,數據不一樣,類型就不一樣,但是數據源不確定,所以我們就需要一介面類型,去實現這個介面的子類做為相近數據的類型,這樣自動獲取對應的數據,是不是很方便、很好用。

問題二:spark Streaming連接kafka

引言:在工作中遇到streaming連接kafka時報錯,說找不到topic的末偏移量?

我首先看了看是不是話題沒有創建好,用命令接收數據,能收到,說明集群沒問題。再測,還是偏移量的問題,這我就犯愁,連接我自己的環境,沒問題,這就更蒙了,

第二次嘗試:看API,源碼手動設置偏移量,嘗試一圈之後,問題依然沒有解決。

第三次嘗試:重新搭環境,結果還是不行

最後,思考我的環境和生產環境的唯一區別就是hosts文件,我將本地的hosts文件配的和生產環境一樣,好了。(困擾我兩天的問題啊)

總結,應用程式中最好不要填寫IP,寫映射(而映射和環境必須一致),這個streamingkafkaUtil的類有關。

問題三:生產中減少窮舉

引言:在生產環境下麵對紛繁的業務處理場景,我們知道要處理很多邏輯代碼,其中有個叫枚舉(也稱窮舉),當處理這類事務時,會產生大量的迴圈執行,而迴圈是最耗CPU的,大量的迭代計算,可直接拉低計算速度,怎麼處理這類問題呢?

對於事務的不定項的選擇幾率,都會有一定的規律,比如說事件的概率發生,根據概率論的知識,我們可以去統計窮舉各項的頻率,按其大小依次排列,這樣前面的枚舉項就可消費大部分數據,剩下的低概率枚舉項就會以最小的執行次數執行。

比如說有1000000條數據,枚舉項有50個,假如平均25次能找到匹配項,就需要運行25000000次(2.5*10的7次方)

換種思路:假如第一枚舉項是是30%,2是25%,3是20%這樣前三項就消費750000*3+250000*25=8500000(8.5*10的6次方)

直接降一個數量級的執行次數,當然這些都是假設,是不太準的

但是思路就一樣,就是將發生概率高的事件統計優先處理,這既符合生活規律,又符合事務發展的客觀規律。

應用場景就太多了,例子:

       例子一:話說網路運營商想分析用戶的上網行為分析。他不會將網路上的各種資源都先收集一份,然後再去匹配每個用戶的某時的上網行為 

那樣做機器也會累的。所以先樣本調查,然後分析大部分的用戶行為特征,根據樣本獲取統計資源,然後這樣以最小的資源消費最大的數據,剩下的小概率事件。

      例子二:百度搜索詞條的建立,也會尋找樣本,統計大概率數據精準處理,作為頻繁搜索詞緩存,讓搜索快速而精準,當然那其他的陌生詞條利用機器學再處理。每天計算詞條的權重,這樣以權重排列,這樣就會讓大概率更加大概率,再次節約速度。

      總而言之,事務的發展規律都是一樣的,總會有大概率事件,事物的發展規律都是一樣的。符合二八定律。用做小的資源去解決大量數據。


您的分享是我們最大的動力!

更多相關文章
  • sql語言進階 典型操作 order by - select * from play_list order by createtime; - select * from play_list order by bookedcount desc,createtime asc; order by 語句用於 ...
  • 目標與目的 學習目標: 掌握日常資料庫建表操作 瞭解表設計的規範 何為表結構設計: 表結構設計需要在正式進行開發之前完成 根據產品需求將複雜的業務模型抽象出來 項目分析 實踐課程模型: 類似電商類的網站 用戶: 核心業務 非核心業務 核心業務: 交易相關 訂單詳情,訂單 商品相關 商品類別,商品 非 ...
  • memcatch 做單純的日活數據,或者靜態數據緩存 redis 做日活數據? mongodb 不建索引,用以插入數據? mongodb 建立索引,用以緩存用於讀取的歷史不活躍數據? mysql 數據持久化存儲 應該建立一個資料庫CRUD框架,然後對外是封裝好的? 總覺得已經有搭配好的框架了。 ...
  • 原因: 之前已經寫過一篇關於列存儲索引的簡介http://www.cnblogs.com/wenBlog/p/4970493.html,很粗糙但是基本闡明瞭列存儲索引的好處。為了更好的理解列存儲索引,接下來我們一起通過列存儲索引與傳統的行存儲索引地對比2014中的列存儲索引帶來了哪些改善。由於已經很 ...
  • 在一次生成AWR報告中,發現在“Instances in this Workload Repository schema”部分,出現了多個實例記錄信息(host敏感信息被用host1,host2,host3替換)。具體信息如下截圖所示: SQL> @?/rdbms/admin/awrrpt Curr... ...
一周排行
  • 上一章介紹了配置的多種數據源被註冊、載入和獲取的過程,本節看一下這個過程系統是如何實現的。(ASP.NET Core 系列目錄) 一、數據源的註冊 在上一節介紹的數據源設置中,appsettings.json、命令行、環境變數三種方式是被系統自動載入的,這是因為系統在webHost.CreateDe ...
  • Controller繼承ControllrBase,ControllerBase繼承IController,而IController里只有一個Execute方法 1、ControllrBase里的Execute(),裡面調用了ExecuteCore(),而ExecuteCore()是個抽象方法,抽象 ...
  • @[toc] 前言 中秋過完不知不覺都已經快兩周沒動這個工程了,最近業務需要總算開始搞後臺雲服務了,果斷直接net core搞起,在做的中間遇到了不少問題,這個後續會一點點列出來包括解決方法,今天就先把之前挖的坑填一個。 Redis 之前在緩存那篇提到過, Cookie , Session , Ca ...
  • 對try catch finally的理解1.finally 總是會運行的,即使在catch中thorw拋出異常了。2.finally 在 return後沒有結束,而是繼續運行finally2.順序的話就是對try-》finally 或者 try-》catch-》finally不管怎樣finally ...
  • 原文地址:https://blog.csdn.net/FL1623863129/article/details/89013137 VS2019於昨日正式發佈,博主立馬下載一個專業版嘗嘗鮮,但是發現項目打開都沒反應,而且VS2019都死在進程,怎麼也打不開,這不是安裝包而是沒有以管理員運行,只要在屬性 ...
  • 單例類public class SnappingClass : ISnappingEnvironment, IExtension { // private static readonly SnappingClass instance = null; static SnappingClass() { ... ...
  • 前提 入行已經7,8年了,一直想做一套漂亮點的自定義控制項,於是就有了本系列文章。 GitHub:https://github.com/kwwwvagaa/NetWinformControl 碼雲:https://gitee.com/kwwwvagaa/net_winform_custom_contr ...
  • 期待已久的.NET Core 3.0即將發佈! .NET Core 3.0在.NET Conf上發佈。大約還有9個多小時後,.NET Conf開始啟動。 為期3天的大概日程安排如下: 第1天-9月23日 9:00-10:00 Microsoft Studios播出的主題演講10:00-17:00從M ...
  • 場景 Winform中實現讀取xml配置文件並動態配置ZedGraph的RadioGroup的選項: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100540708 在上面實現了將RadioGroup的選項根據配置文件動態配置後 ...
  • 原文地址: https://blog.csdn.net/chadcao/article/details/7859394 ASP.NET的安全認證,共有“Windows”、“Form”、“Passport”、“None”四種驗證模式。下麵來說說From認證,內容分三部分: 第一部分—— 怎樣實現Fro ...
x