一个色的导航资源精品在线观看|手机看片在线精品视频|伊人亚洲成人电影|亚洲欧美在线男女|无码无码在线观看五月精品视频在线|超碰日韩欧美在线|午夜精品蜜桃一区二区久久久|91欧美动态国产精品女主播|色欲色香天天天综合网在线观看免费|伊人春色在线伊人

json hessian

時(shí)間:2024-10-12 01:28 人氣:0 編輯:招聘街

一、json hessian

了解 JSON 和 Hessian:兩種常見(jiàn)的數(shù)據(jù)交換格式

在今天的數(shù)字化世界中,數(shù)據(jù)交換是互聯(lián)網(wǎng)和軟件應(yīng)用程序中不可或缺的一部分。為了在不同系統(tǒng)之間傳輸數(shù)據(jù),我們通常會(huì)使用各種數(shù)據(jù)交換格式。在本文中,我們將重點(diǎn)介紹兩種常見(jiàn)的數(shù)據(jù)交換格式:JSON 和 Hessian。

JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式,它易于人類(lèi)閱讀和編寫(xiě),同時(shí)也易于機(jī)器解析和生成。JSON采用鍵/值對(duì)的形式組織數(shù)據(jù),數(shù)據(jù)之間使用逗號(hào)分隔,而鍵和值之間使用冒號(hào)分隔。這種簡(jiǎn)潔的結(jié)構(gòu)使得JSON非常適用于前端與后端之間的數(shù)據(jù)交換,也被廣泛應(yīng)用于Web開(kāi)發(fā)和API設(shè)計(jì)中。

與JSON不同,Hessian 是一種二進(jìn)制數(shù)據(jù)交換格式,它旨在提高數(shù)據(jù)傳輸?shù)男屎托阅?。Hessian采用緊湊的二進(jìn)制表示形式,相比于文本格式如JSON,它在網(wǎng)絡(luò)傳輸時(shí)占用的帶寬更少。這使得Hessian特別適用于對(duì)網(wǎng)絡(luò)帶寬和速度要求較高的場(chǎng)景,比如移動(dòng)應(yīng)用程序開(kāi)發(fā)和分布式系統(tǒng)通信中。

JSON vs. Hessian:比較兩種數(shù)據(jù)交換格式的特點(diǎn)

雖然JSON和Hessian都是數(shù)據(jù)交換格式,但它們?cè)诤芏喾矫嬗兄@著的區(qū)別。下面我們將比較這兩種格式的特點(diǎn),以便更好地理解它們各自的優(yōu)勢(shì)和適用場(chǎng)景。

  • 可讀性: JSON具有良好的人類(lèi)可讀性,由于其文本形式,可以方便地查看和編輯。相比之下,Hessian作為二進(jìn)制格式,不易被人直接讀懂。
  • 帶寬效率: Hessian在數(shù)據(jù)傳輸時(shí)占用的帶寬較少,相比于JSON,可以更快地傳輸數(shù)據(jù)并節(jié)約網(wǎng)絡(luò)資源。
  • 解析速度: 由于Hessian是二進(jìn)制格式,機(jī)器在解析該格式時(shí)通常更快速,而JSON的解析可能會(huì)稍慢一些。
  • 語(yǔ)言支持: JSON在幾乎所有編程語(yǔ)言中都有良好的支持,而Hessian可能不如JSON那么普及,某些語(yǔ)言的支持可能較少。
  • 適用領(lǐng)域: JSON常用于Web開(kāi)發(fā)中的API通信和數(shù)據(jù)交換,而Hessian更適用于要求高效率和性能的場(chǎng)景。

JSON 和 Hessian 的應(yīng)用場(chǎng)景

隨著互聯(lián)網(wǎng)和移動(dòng)應(yīng)用的快速發(fā)展,JSON和Hessian已經(jīng)在許多領(lǐng)域找到了廣泛的應(yīng)用。以下是它們常見(jiàn)的應(yīng)用場(chǎng)景:

  • JSON應(yīng)用場(chǎng)景:
    • RESTful API的數(shù)據(jù)交換
    • 前后端數(shù)據(jù)傳輸
    • 配置文件格式
    • Web服務(wù)的數(shù)據(jù)返回
  • Hessian應(yīng)用場(chǎng)景:
    • 分布式系統(tǒng)間的數(shù)據(jù)傳輸
    • 移動(dòng)應(yīng)用的網(wǎng)絡(luò)通信
    • RPC(遠(yuǎn)程過(guò)程調(diào)用)
    • 對(duì)網(wǎng)絡(luò)帶寬要求高的場(chǎng)景

結(jié)語(yǔ)

JSON和Hessian作為不同類(lèi)型的數(shù)據(jù)交換格式,各有其優(yōu)勢(shì)和適用范圍。在實(shí)際開(kāi)發(fā)中,我們應(yīng)根據(jù)具體的應(yīng)用場(chǎng)景和需求選擇合適的數(shù)據(jù)交換格式,以確保數(shù)據(jù)傳輸?shù)母咝院涂煽啃?。希望通過(guò)本文的介紹,您能更好地了解JSON和Hessian,并在相關(guān)項(xiàng)目中做出明智的選擇。

二、hessian json

在當(dāng)今數(shù)字化時(shí)代,不同的數(shù)據(jù)傳輸格式扮演著至關(guān)重要的角色。其中,hessianjson 是兩種常用的數(shù)據(jù)傳輸協(xié)議,它們分別具有各自的特點(diǎn)和優(yōu)勢(shì)。

什么是 Hessian?

Hessian 是一種基于二進(jìn)制協(xié)議的數(shù)據(jù)傳輸格式,旨在實(shí)現(xiàn)快速且高效的數(shù)據(jù)交換。它使用了基于二進(jìn)制的數(shù)據(jù)編碼方式,在數(shù)據(jù)傳輸時(shí)能夠更加節(jié)省帶寬和提高傳輸效率。因此,hessian 在一些對(duì)性能要求較高的應(yīng)用場(chǎng)景中備受青睞。

為什么選擇 Hessian?

相比于一些文本協(xié)議,hessian 具有更快的傳輸速度和更小的數(shù)據(jù)包大小。這意味著在網(wǎng)絡(luò)傳輸過(guò)程中,hessian 可以減少延遲,并縮短數(shù)據(jù)傳輸?shù)臅r(shí)間。另外,hessian 對(duì)于不同編程語(yǔ)言的兼容性也相對(duì)較好,使得不同系統(tǒng)間的數(shù)據(jù)交換更加便捷。

什么是 JSON?

JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式,具有易讀性和便于理解的特點(diǎn)。它基于文本,采用鍵值對(duì)的方式組織數(shù)據(jù),在前后端數(shù)據(jù)交互中被廣泛應(yīng)用。

為什么選擇 JSON?

由于其簡(jiǎn)潔明了的結(jié)構(gòu)和跨語(yǔ)言的特性,json 在 Web 開(kāi)發(fā)中被廣泛采用。無(wú)論是用于前端頁(yè)面與后端服務(wù)器之間的數(shù)據(jù)傳輸,還是作為配置文件的存儲(chǔ)格式,json 都展現(xiàn)出了其強(qiáng)大的應(yīng)用價(jià)值。

Hessian 與 JSON 的比較

雖然 hessianjson 都是用于數(shù)據(jù)傳輸?shù)母袷?,但它們?cè)谝恍┓矫娲嬖诿黠@的差異。 hessian 更加注重于性能和效率,適合于對(duì)速度有較高要求的系統(tǒng)。而 json 則更注重于易讀性和通用性,適合于需要跨語(yǔ)言交互的場(chǎng)景。

在實(shí)際應(yīng)用中,開(kāi)發(fā)者需要根據(jù)項(xiàng)目需求和具體場(chǎng)景來(lái)選擇合適的數(shù)據(jù)傳輸格式。如果注重性能和效率,可以考慮使用 hessian;而如果更看重易用性和通用性,json 可能更為適合。

結(jié)語(yǔ)

在當(dāng)前信息交互日益頻繁的環(huán)境下,選擇合適的數(shù)據(jù)傳輸格式顯得尤為重要。HessianJSON 作為兩種常用的數(shù)據(jù)傳輸協(xié)議,在不同的場(chǎng)景下各具優(yōu)勢(shì),開(kāi)發(fā)者可以根據(jù)項(xiàng)目的具體需求來(lái)靈活選擇,以實(shí)現(xiàn)最佳的數(shù)據(jù)交換效果。

三、hessian和dubbo的區(qū)別?

hessian和dubbo的二者主要區(qū)別是協(xié)議不同

dubbo協(xié)議 Dubbo缺省協(xié)議采用單一長(zhǎng)連接和NIO異步通訊,適合于小數(shù)據(jù)量大并發(fā)的服務(wù)調(diào)用,以及服務(wù)消費(fèi)者機(jī)器數(shù)遠(yuǎn)大于服務(wù)提供者機(jī)器數(shù)的情況。 缺省協(xié)議,使用基于mina1.1.7+hessian3.2.1的tbremoting交互。 連接個(gè)數(shù):單連接連接方式:長(zhǎng)連接傳輸協(xié)議:TCP 傳輸方式:NIO異步傳輸序列化:Hessian二進(jìn)制序列化適用范圍:傳入傳出參數(shù)數(shù)據(jù)包較小(建議小于100K),消費(fèi)者比提供者個(gè)數(shù)多,單一消費(fèi)者無(wú)法壓滿(mǎn)提供者,盡量不要用dubbo協(xié)議傳輸大文件或超大字符串。適用場(chǎng)景:常規(guī)遠(yuǎn)程服務(wù)方法調(diào)用 為什么要消費(fèi)者比提供者個(gè)數(shù)多: 因dubbo協(xié)議采用單一長(zhǎng)連接, 假設(shè)網(wǎng)絡(luò)為千兆網(wǎng)卡(1024Mbit=128MByte), 根據(jù)測(cè)試經(jīng)驗(yàn)數(shù)據(jù)每條連接最多只能壓滿(mǎn)7MByte(不同的環(huán)境可能不一樣,供參考), 理論上1個(gè)服務(wù)提供者需要20個(gè)服務(wù)消費(fèi)者才能壓滿(mǎn)網(wǎng)卡。 為什么不能傳大包: 因dubbo協(xié)議采用單一長(zhǎng)連接, 如果每次請(qǐng)求的數(shù)據(jù)包大小為500KByte,假設(shè)網(wǎng)絡(luò)為千兆網(wǎng)卡(1024Mbit=128MByte),每條連接最大7MByte(不同的環(huán)境可能不一樣,供參考), 單個(gè)服務(wù)提供者的TPS(每秒處理事務(wù)數(shù))最大為:128MByte/ 500KByte = 262。單個(gè)消費(fèi)者調(diào)用單個(gè)服務(wù)提供者的TPS(每秒處理事務(wù)數(shù))最大為:7MByte/ 500KByte = 14。如果能接受,可以考慮使用,否則網(wǎng)絡(luò)將成為瓶頸。 為什么采用異步單一長(zhǎng)連接: 因?yàn)榉?wù)的現(xiàn)狀大都是服務(wù)提供者少,通常只有幾臺(tái)機(jī)器, 而服務(wù)的消費(fèi)者多,可能整個(gè)網(wǎng)站都在訪問(wèn)該服務(wù), 比如Morgan的提供者只有6臺(tái)提供者,卻有上百臺(tái)消費(fèi)者,每天有1.5億次調(diào)用, 如果采用常規(guī)的hessian服務(wù),服務(wù)提供者很容易就被壓跨, 通過(guò)單一連接,保證單一消費(fèi)者不會(huì)壓死提供者, 長(zhǎng)連接,減少連接握手驗(yàn)證等, 并使用異步IO,復(fù)用線程池,防止C10K問(wèn)題。 

2.

RMI RMI協(xié)議采用JDK標(biāo)準(zhǔn)的java.rmi.*實(shí)現(xiàn),采用阻塞式短連接和JDK標(biāo)準(zhǔn)序列化方式 Java標(biāo)準(zhǔn)的遠(yuǎn)程調(diào)用協(xié)議。 連接個(gè)數(shù):多連接連接方式:短連接傳輸協(xié)議:TCP 傳輸方式:同步傳輸序列化:Java標(biāo)準(zhǔn)二進(jìn)制序列化適用范圍:傳入傳出參數(shù)數(shù)據(jù)包大小混合,消費(fèi)者與提供者個(gè)數(shù)差不多,可傳文件。適用場(chǎng)景:常規(guī)遠(yuǎn)程服務(wù)方法調(diào)用,與原生RMI服務(wù)互操作 

3.

hessian Hessian協(xié)議用于集成Hessian的服務(wù),Hessian底層采用Http通訊,采用Servlet暴露服務(wù),Dubbo缺省內(nèi)嵌Jetty作為服務(wù)器實(shí)現(xiàn) 基于Hessian的遠(yuǎn)程調(diào)用協(xié)議。 連接個(gè)數(shù):多連接連接方式:短連接傳輸協(xié)議:HTTP 傳輸方式:同步傳輸序列化:Hessian二進(jìn)制序列化適用范圍:傳入傳出參數(shù)數(shù)據(jù)包較大,提供者比消費(fèi)者個(gè)數(shù)多,提供者壓力較大,可傳文件。適用場(chǎng)景:頁(yè)面?zhèn)鬏?文件傳輸,或與原生hessian服務(wù)互操作 

4.

http 采用Spring的HttpInvoker實(shí)現(xiàn) 基于http表單的遠(yuǎn)程調(diào)用協(xié)議

四、hessian方程特征值?

設(shè) A 是n階方陣,如果存在數(shù)m和非零n維列向量 x,使得 Ax=mx 成立,則稱(chēng) m 是A的一個(gè)特征值(characteristic value)或本征值(eigenvalue)。非零n維列向量x稱(chēng)為矩陣A的屬于(對(duì)應(yīng)于)特征值m的特征向量或本征向量,簡(jiǎn)稱(chēng)A的特征向量或A的本征向量。

Hessian矩陣的特征值就是形容其在該點(diǎn)附近特征向量方向的凹凸性,特征值越大,凸性越強(qiáng)。你可以把函數(shù)想想成一個(gè)小山坡,陡的那面是特征值大的方向,平緩的是特征值小的方向。而凸性和優(yōu)化方法的收斂速度有關(guān),比如梯度下降。如果正定Hessian矩陣的特征值都差不多,那么梯度下降的收斂速度越快,反之如果其特征值相差很大,那么收斂速度越慢

五、dubbo和hessian的區(qū)別?

Hessian和Dubbo都是用于分布式系統(tǒng)中的遠(yuǎn)程調(diào)用框架,但它們的實(shí)現(xiàn)方式有所不同。Hessian是一種基于HTTP協(xié)議的輕量級(jí)RPC框架,使用Java語(yǔ)言開(kāi)發(fā),支持多種編程語(yǔ)言間的遠(yuǎn)程調(diào)用。Hessian的特點(diǎn)包括:

1. 簡(jiǎn)單易用:Hessian可以直接將Java對(duì)象序列化成二進(jìn)制數(shù)據(jù)傳輸?shù)椒?wù)器端,從而實(shí)現(xiàn)遠(yuǎn)程方法調(diào)用。這使得開(kāi)發(fā)者無(wú)需手動(dòng)編寫(xiě)序列化和反序列化代碼,從而大大簡(jiǎn)化了分布式系統(tǒng)的開(kāi)發(fā)難度。

2. 高效性:Hessian采用二進(jìn)制數(shù)據(jù)傳輸格式,并對(duì)傳輸數(shù)據(jù)進(jìn)行了壓縮處理,因此可以提供較高的網(wǎng)絡(luò)傳輸性能。

3. 跨語(yǔ)言支持:Hessian不僅支持Java語(yǔ)言開(kāi)發(fā),還可以與其他編程語(yǔ)言進(jìn)行交互,例如C++, C#, Python等。

Dubbo是一個(gè)面向服務(wù)治理的RPC框架,同時(shí)也支持通信協(xié)議的擴(kuò)展。Dubbo在Hessian的基礎(chǔ)上做了許多擴(kuò)展和優(yōu)化,并引入了插件機(jī)制、服務(wù)治理、負(fù)載均衡、集群容錯(cuò)等關(guān)鍵功能。Dubbo針對(duì)企業(yè)級(jí)應(yīng)用場(chǎng)景設(shè)計(jì)而成,并且已經(jīng)有著廣泛的應(yīng)用基礎(chǔ)。

Dubbo的特點(diǎn)包括:

1. 高性能:Dubbo采用Netty作為通信模塊,使用NIO異步處理網(wǎng)絡(luò)請(qǐng)求,因此可以提供高并發(fā)、低延遲的服務(wù)。

2. 配置靈活:Dubbo允許開(kāi)發(fā)者通過(guò)XML或注解配置服務(wù)提供者和消費(fèi)者的相關(guān)參數(shù),同時(shí)還可以基于ZooKeeper等中間件進(jìn)行集群管理和服務(wù)治理。

3. 豐富功能:Dubbo提供了豐富的功能支持,包括負(fù)載均衡、集群容錯(cuò)、服務(wù)路由等,可以應(yīng)對(duì)不同場(chǎng)景下的應(yīng)用需求。

總之,Hessian和Dubbo都是優(yōu)秀的遠(yuǎn)程調(diào)用框架,具有各自獨(dú)特的特點(diǎn)和優(yōu)勢(shì),在實(shí)際項(xiàng)目中需要根據(jù)具體業(yè)務(wù)需求進(jìn)行選擇。

六、hessian與dubbo協(xié)議的區(qū)別?

區(qū)別:

dubbo 默認(rèn)協(xié)議:

單一 TCP 長(zhǎng)連接,Hessian 二進(jìn)制序列化和 NIO 異步通訊

適合于小數(shù)據(jù)包大并發(fā)的服務(wù)調(diào)用和服務(wù)消費(fèi)者數(shù)遠(yuǎn)大于服務(wù)提供者數(shù)的情況

不適合傳送大數(shù)據(jù)包的服務(wù)

hessian 協(xié)議:

底層 Http 通訊,Servlet 暴露服務(wù),Dubbo 缺省內(nèi)嵌 Jetty 作為服務(wù)器實(shí)現(xiàn)

可與原生 Hessian 服務(wù)互操作

通訊效率高于 WebService 和 Java 自帶的序列化

參數(shù)及返回值需實(shí)現(xiàn) Serializable 接口,自定義實(shí)現(xiàn) List、Map、Number、Date、Calendar 等接口

適用于傳輸數(shù)據(jù)包較大,提供者比消費(fèi)者個(gè)數(shù)多,提供者壓力較大。

七、dubbo為什么使用hessian序列號(hào)?

dubbo 默認(rèn)協(xié)議:

單一 TCP 長(zhǎng)連接,Hessian 二進(jìn)制序列化和 NIO 異步通訊

適合于小數(shù)據(jù)包大并發(fā)的服務(wù)調(diào)用和服務(wù)消費(fèi)者數(shù)遠(yuǎn)大于服務(wù)提供者數(shù)的情況

不適合傳送大數(shù)據(jù)包的服務(wù)

hessian 協(xié)議:

底層 Http 通訊,Servlet 暴露服務(wù),Dubbo 缺省內(nèi)嵌 Jetty 作為服務(wù)器實(shí)現(xiàn)

可與原生 Hessian 服務(wù)互操作

通訊效率高于 WebService 和 Java 自帶的序列化

參數(shù)及返回值需實(shí)現(xiàn) Serializable 接口,自定義實(shí)現(xiàn) List、Map、Number、Date、Calendar 等接口

適用于傳輸數(shù)據(jù)包較大,提供者比消費(fèi)者個(gè)數(shù)多,提供者壓力較大。

八、Hessian矩陣的特征值有什么含義?

設(shè) A 是n階方陣,如果存在數(shù)m和非零n維列向量 x,使得 Ax=mx 成立,則稱(chēng) m 是A的一個(gè)特征值(characteristic value)或本征值(eigenvalue)。

非零n維列向量x稱(chēng)為矩陣A的屬于(對(duì)應(yīng)于)特征值m的特征向量或本征向量,簡(jiǎn)稱(chēng)A的特征向量或A的本征向量。 Hessian矩陣的特征值就是形容其在該點(diǎn)附近特征向量方向的凹凸性,特征值越大,凸性越強(qiáng)。

你可以把函數(shù)想想成一個(gè)小山坡,陡的那面是特征值大的方向,平緩的是特征值小的方向。

而凸性和優(yōu)化方法的收斂速度有關(guān),比如梯度下降。

如果正定Hessian矩陣的特征值都差不多,那么梯度下降的收斂速度越快,反之如果其特征值相差很大,那么收斂速度越慢。

九、hessian協(xié)議和http協(xié)議有什么優(yōu)勢(shì)和差異?

關(guān)于這個(gè)問(wèn)題,Hessian協(xié)議和HTTP協(xié)議的主要區(qū)別在于它們的用途和性能。

Hessian協(xié)議是一種二進(jìn)制協(xié)議,旨在為Java對(duì)象提供高效的遠(yuǎn)程調(diào)用服務(wù)。它使用了Java序列化技術(shù),可以快速地序列化和反序列化Java對(duì)象,因此在處理大量對(duì)象時(shí)效率很高。Hessian協(xié)議不需要HTTP協(xié)議的額外的請(qǐng)求頭和響應(yīng)頭,因此可以減少網(wǎng)絡(luò)傳輸?shù)拈_(kāi)銷(xiāo)。

HTTP協(xié)議則是一種基于文本的協(xié)議,它主要用于Web應(yīng)用程序之間的通信。HTTP協(xié)議的優(yōu)勢(shì)在于它的通用性和可擴(kuò)展性。它可以通過(guò)添加自定義的請(qǐng)求頭和響應(yīng)頭來(lái)擴(kuò)展功能,而且可以使用各種不同的傳輸協(xié)議(如TCP/IP、SSL等)來(lái)保證數(shù)據(jù)傳輸?shù)陌踩院涂煽啃浴?/p>

總的來(lái)說(shuō),Hessian協(xié)議適用于需要高效的遠(yuǎn)程調(diào)用服務(wù)的場(chǎng)景,而HTTP協(xié)議則適用于Web應(yīng)用程序之間的通信和擴(kuò)展。

十、mahout面試題?

之前看了Mahout官方示例 20news 的調(diào)用實(shí)現(xiàn);于是想根據(jù)示例的流程實(shí)現(xiàn)其他例子。網(wǎng)上看到了一個(gè)關(guān)于天氣適不適合打羽毛球的例子。

訓(xùn)練數(shù)據(jù):

Day Outlook Temperature Humidity Wind PlayTennis

D1 Sunny Hot High Weak No

D2 Sunny Hot High Strong No

D3 Overcast Hot High Weak Yes

D4 Rain Mild High Weak Yes

D5 Rain Cool Normal Weak Yes

D6 Rain Cool Normal Strong No

D7 Overcast Cool Normal Strong Yes

D8 Sunny Mild High Weak No

D9 Sunny Cool Normal Weak Yes

D10 Rain Mild Normal Weak Yes

D11 Sunny Mild Normal Strong Yes

D12 Overcast Mild High Strong Yes

D13 Overcast Hot Normal Weak Yes

D14 Rain Mild High Strong No

檢測(cè)數(shù)據(jù):

sunny,hot,high,weak

結(jié)果:

Yes=》 0.007039

No=》 0.027418

于是使用Java代碼調(diào)用Mahout的工具類(lèi)實(shí)現(xiàn)分類(lèi)。

基本思想:

1. 構(gòu)造分類(lèi)數(shù)據(jù)。

2. 使用Mahout工具類(lèi)進(jìn)行訓(xùn)練,得到訓(xùn)練模型。

3。將要檢測(cè)數(shù)據(jù)轉(zhuǎn)換成vector數(shù)據(jù)。

4. 分類(lèi)器對(duì)vector數(shù)據(jù)進(jìn)行分類(lèi)。

接下來(lái)貼下我的代碼實(shí)現(xiàn)=》

1. 構(gòu)造分類(lèi)數(shù)據(jù):

在hdfs主要?jiǎng)?chuàng)建一個(gè)文件夾路徑 /zhoujainfeng/playtennis/input 并將分類(lèi)文件夾 no 和 yes 的數(shù)據(jù)傳到hdfs上面。

數(shù)據(jù)文件格式,如D1文件內(nèi)容: Sunny Hot High Weak

2. 使用Mahout工具類(lèi)進(jìn)行訓(xùn)練,得到訓(xùn)練模型。

3。將要檢測(cè)數(shù)據(jù)轉(zhuǎn)換成vector數(shù)據(jù)。

4. 分類(lèi)器對(duì)vector數(shù)據(jù)進(jìn)行分類(lèi)。

這三步,代碼我就一次全貼出來(lái);主要是兩個(gè)類(lèi) PlayTennis1 和 BayesCheckData = =》

package myTesting.bayes;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.util.ToolRunner;

import org.apache.mahout.classifier.naivebayes.training.TrainNaiveBayesJob;

import org.apache.mahout.text.SequenceFilesFromDirectory;

import org.apache.mahout.vectorizer.SparseVectorsFromSequenceFiles;

public class PlayTennis1 {

private static final String WORK_DIR = "hdfs://192.168.9.72:9000/zhoujianfeng/playtennis";

/*

* 測(cè)試代碼

*/

public static void main(String[] args) {

//將訓(xùn)練數(shù)據(jù)轉(zhuǎn)換成 vector數(shù)據(jù)

makeTrainVector();

//產(chǎn)生訓(xùn)練模型

makeModel(false);

//測(cè)試檢測(cè)數(shù)據(jù)

BayesCheckData.printResult();

}

public static void makeCheckVector(){

//將測(cè)試數(shù)據(jù)轉(zhuǎn)換成序列化文件

try {

Configuration conf = new Configuration();

conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));

String input = WORK_DIR+Path.SEPARATOR+"testinput";

String output = WORK_DIR+Path.SEPARATOR+"tennis-test-seq";

Path in = new Path(input);

Path out = new Path(output);

FileSystem fs = FileSystem.get(conf);

if(fs.exists(in)){

if(fs.exists(out)){

//boolean參數(shù)是,是否遞歸刪除的意思

fs.delete(out, true);

}

SequenceFilesFromDirectory sffd = new SequenceFilesFromDirectory();

String[] params = new String[]{"-i",input,"-o",output,"-ow"};

ToolRunner.run(sffd, params);

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

System.out.println("文件序列化失敗!");

System.exit(1);

}

//將序列化文件轉(zhuǎn)換成向量文件

try {

Configuration conf = new Configuration();

conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));

String input = WORK_DIR+Path.SEPARATOR+"tennis-test-seq";

String output = WORK_DIR+Path.SEPARATOR+"tennis-test-vectors";

Path in = new Path(input);

Path out = new Path(output);

FileSystem fs = FileSystem.get(conf);

if(fs.exists(in)){

if(fs.exists(out)){

//boolean參數(shù)是,是否遞歸刪除的意思

fs.delete(out, true);

}

SparseVectorsFromSequenceFiles svfsf = new SparseVectorsFromSequenceFiles();

String[] params = new String[]{"-i",input,"-o",output,"-lnorm","-nv","-wt","tfidf"};

ToolRunner.run(svfsf, params);

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

System.out.println("序列化文件轉(zhuǎn)換成向量失??!");

System.out.println(2);

}

}

public static void makeTrainVector(){

//將測(cè)試數(shù)據(jù)轉(zhuǎn)換成序列化文件

try {

Configuration conf = new Configuration();

conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));

String input = WORK_DIR+Path.SEPARATOR+"input";

String output = WORK_DIR+Path.SEPARATOR+"tennis-seq";

Path in = new Path(input);

Path out = new Path(output);

FileSystem fs = FileSystem.get(conf);

if(fs.exists(in)){

if(fs.exists(out)){

//boolean參數(shù)是,是否遞歸刪除的意思

fs.delete(out, true);

}

SequenceFilesFromDirectory sffd = new SequenceFilesFromDirectory();

String[] params = new String[]{"-i",input,"-o",output,"-ow"};

ToolRunner.run(sffd, params);

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

System.out.println("文件序列化失??!");

System.exit(1);

}

//將序列化文件轉(zhuǎn)換成向量文件

try {

Configuration conf = new Configuration();

conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));

String input = WORK_DIR+Path.SEPARATOR+"tennis-seq";

String output = WORK_DIR+Path.SEPARATOR+"tennis-vectors";

Path in = new Path(input);

Path out = new Path(output);

FileSystem fs = FileSystem.get(conf);

if(fs.exists(in)){

if(fs.exists(out)){

//boolean參數(shù)是,是否遞歸刪除的意思

fs.delete(out, true);

}

SparseVectorsFromSequenceFiles svfsf = new SparseVectorsFromSequenceFiles();

String[] params = new String[]{"-i",input,"-o",output,"-lnorm","-nv","-wt","tfidf"};

ToolRunner.run(svfsf, params);

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

System.out.println("序列化文件轉(zhuǎn)換成向量失??!");

System.out.println(2);

}

}

public static void makeModel(boolean completelyNB){

try {

Configuration conf = new Configuration();

conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));

String input = WORK_DIR+Path.SEPARATOR+"tennis-vectors"+Path.SEPARATOR+"tfidf-vectors";

String model = WORK_DIR+Path.SEPARATOR+"model";

String labelindex = WORK_DIR+Path.SEPARATOR+"labelindex";

Path in = new Path(input);

Path out = new Path(model);

Path label = new Path(labelindex);

FileSystem fs = FileSystem.get(conf);

if(fs.exists(in)){

if(fs.exists(out)){

//boolean參數(shù)是,是否遞歸刪除的意思

fs.delete(out, true);

}

if(fs.exists(label)){

//boolean參數(shù)是,是否遞歸刪除的意思

fs.delete(label, true);

}

TrainNaiveBayesJob tnbj = new TrainNaiveBayesJob();

String[] params =null;

if(completelyNB){

params = new String[]{"-i",input,"-el","-o",model,"-li",labelindex,"-ow","-c"};

}else{

params = new String[]{"-i",input,"-el","-o",model,"-li",labelindex,"-ow"};

}

ToolRunner.run(tnbj, params);

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

System.out.println("生成訓(xùn)練模型失?。?#34;);

System.exit(3);

}

}

}

package myTesting.bayes;

import java.io.IOException;

import java.util.HashMap;

import java.util.Map;

import org.apache.commons.lang.StringUtils;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.fs.PathFilter;

import org.apache.hadoop.io.IntWritable;

import org.apache.hadoop.io.LongWritable;

import org.apache.hadoop.io.Text;

import org.apache.mahout.classifier.naivebayes.BayesUtils;

import org.apache.mahout.classifier.naivebayes.NaiveBayesModel;

import org.apache.mahout.classifier.naivebayes.StandardNaiveBayesClassifier;

import org.apache.mahout.common.Pair;

import org.apache.mahout.common.iterator.sequencefile.PathType;

import org.apache.mahout.common.iterator.sequencefile.SequenceFileDirIterable;

import org.apache.mahout.math.RandomAccessSparseVector;

import org.apache.mahout.math.Vector;

import org.apache.mahout.math.Vector.Element;

import org.apache.mahout.vectorizer.TFIDF;

import com.google.common.collect.ConcurrentHashMultiset;

import com.google.common.collect.Multiset;

public class BayesCheckData {

private static StandardNaiveBayesClassifier classifier;

private static Map<String, Integer> dictionary;

private static Map<Integer, Long> documentFrequency;

private static Map<Integer, String> labelIndex;

public void init(Configuration conf){

try {

String modelPath = "/zhoujianfeng/playtennis/model";

String dictionaryPath = "/zhoujianfeng/playtennis/tennis-vectors/dictionary.file-0";

String documentFrequencyPath = "/zhoujianfeng/playtennis/tennis-vectors/df-count";

String labelIndexPath = "/zhoujianfeng/playtennis/labelindex";

dictionary = readDictionnary(conf, new Path(dictionaryPath));

documentFrequency = readDocumentFrequency(conf, new Path(documentFrequencyPath));

labelIndex = BayesUtils.readLabelIndex(conf, new Path(labelIndexPath));

NaiveBayesModel model = NaiveBayesModel.materialize(new Path(modelPath), conf);

classifier = new StandardNaiveBayesClassifier(model);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

System.out.println("檢測(cè)數(shù)據(jù)構(gòu)造成vectors初始化時(shí)報(bào)錯(cuò)。。。。");

System.exit(4);

}

}

/**

* 加載字典文件,Key: TermValue; Value:TermID

* @param conf

* @param dictionnaryDir

* @return

*/

private static Map<String, Integer> readDictionnary(Configuration conf, Path dictionnaryDir) {

Map<String, Integer> dictionnary = new HashMap<String, Integer>();

PathFilter filter = new PathFilter() {

@Override

public boolean accept(Path path) {

String name = path.getName();

return name.startsWith("dictionary.file");

}

};

for (Pair<Text, IntWritable> pair : new SequenceFileDirIterable<Text, IntWritable>(dictionnaryDir, PathType.LIST, filter, conf)) {

dictionnary.put(pair.getFirst().toString(), pair.getSecond().get());

}

return dictionnary;

}

/**

* 加載df-count目錄下TermDoc頻率文件,Key: TermID; Value:DocFreq

* @param conf

* @param dictionnaryDir

* @return

*/

private static Map<Integer, Long> readDocumentFrequency(Configuration conf, Path documentFrequencyDir) {

Map<Integer, Long> documentFrequency = new HashMap<Integer, Long>();

PathFilter filter = new PathFilter() {

@Override

public boolean accept(Path path) {

return path.getName().startsWith("part-r");

}

};

for (Pair<IntWritable, LongWritable> pair : new SequenceFileDirIterable<IntWritable, LongWritable>(documentFrequencyDir, PathType.LIST, filter, conf)) {

documentFrequency.put(pair.getFirst().get(), pair.getSecond().get());

}

return documentFrequency;

}

public static String getCheckResult(){

Configuration conf = new Configuration();

conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));

String classify = "NaN";

BayesCheckData cdv = new BayesCheckData();

cdv.init(conf);

System.out.println("init done...............");

Vector vector = new RandomAccessSparseVector(10000);

TFIDF tfidf = new TFIDF();

//sunny,hot,high,weak

Multiset<String> words = ConcurrentHashMultiset.create();

words.add("sunny",1);

words.add("hot",1);

words.add("high",1);

words.add("weak",1);

int documentCount = documentFrequency.get(-1).intValue(); // key=-1時(shí)表示總文檔數(shù)

for (Multiset.Entry<String> entry : words.entrySet()) {

String word = entry.getElement();

int count = entry.getCount();

Integer wordId = dictionary.get(word); // 需要從dictionary.file-0文件(tf-vector)下得到wordID,

if (StringUtils.isEmpty(wordId.toString())){

continue;

}

if (documentFrequency.get(wordId) == null){

continue;

}

Long freq = documentFrequency.get(wordId);

double tfIdfValue = tfidf.calculate(count, freq.intValue(), 1, documentCount);

vector.setQuick(wordId, tfIdfValue);

}

// 利用貝葉斯算法開(kāi)始分類(lèi),并提取得分最好的分類(lèi)label

Vector resultVector = classifier.classifyFull(vector);

double bestScore = -Double.MAX_VALUE;

int bestCategoryId = -1;

for(Element element: resultVector.all()) {

int categoryId = element.index();

double score = element.get();

System.out.println("categoryId:"+categoryId+" score:"+score);

if (score > bestScore) {

bestScore = score;

bestCategoryId = categoryId;

}

}

classify = labelIndex.get(bestCategoryId)+"(categoryId="+bestCategoryId+")";

return classify;

}

public static void printResult(){

System.out.println("檢測(cè)所屬類(lèi)別是:"+getCheckResult());

}

}

相關(guān)資訊
熱門(mén)頻道

Copyright © 2024 招聘街 滇ICP備2024020316號(hào)-38