偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

學(xué)習(xí)這門(mén)語(yǔ)言兩個(gè)月了,還是卡在了加減乘除這里...

開(kāi)發(fā) 后端
scala 對(duì)于類(lèi)型的嚴(yán)格要求已經(jīng)其從函數(shù)式編程那里借鑒來(lái)的思想,讓代碼寫(xiě)得太爽了。大部分問(wèn)題,編譯期就能發(fā)現(xiàn),而且配合上 IDEA 的自動(dòng)補(bǔ)全,真的很舒服。

[[424065]]

因?yàn)闃I(yè)務(wù)需要(項(xiàng)目技術(shù)棧為 spark 2+ ),七八月份興沖沖從學(xué)校圖書(shū)館借了書(shū),學(xué)了 scala + spark ,還寫(xiě)了不少博文,其中有幾篇被拿來(lái)發(fā)推送:Scala,一門(mén)「特立獨(dú)行」的語(yǔ)言!、【疑惑】如何從 Spark 的 DataFrame 中取出具體某一行? ...

但實(shí)際操作起來(lái),還是遇到不少問(wèn)題。

收獲經(jīng)驗(yàn)有二:

  • 看書(shū)(尤其國(guó)內(nèi)教材)理解理解概念還行,但是對(duì)于實(shí)際操作沒(méi)啥大用
  • 接觸一門(mén)新的編程語(yǔ)言,首先應(yīng)該閱讀大量?jī)?yōu)秀的案例代碼,還有理解清楚數(shù)據(jù)類(lèi)型

舉個(gè)例子,我昨天上午一直被這個(gè)糾纏著:請(qǐng)你給 spark 中 dataframe 的某一列數(shù) 取為。

按理說(shuō)不難吧。要是 python 的 pandas 就直接上了:

  1. # pandas 
  2. df['sig_x'] = df['x'].apply(lambda x: 1 / (1 - np.exp(-x))) 

但是 spark 不行。

spark 中,新建一列使用的函數(shù)是 withColumn ,首先傳入函數(shù)名,接下來(lái)傳入一個(gè) col 對(duì)象。

這個(gè) col 對(duì)象就有講究了,雖然我今天看來(lái)還是比較直觀好理解的,但是昨天可就在里面周旋了好一陣子。

首先,如果我想使用列 x ,我不可以直接 "x" ,因?yàn)檫@是一個(gè)字符串,我需要調(diào)用隱式轉(zhuǎn)換的函數(shù) $ ,而這個(gè) $ 實(shí)際上在 spark.implicits._ 中。

值得注意的是, spark 是你的 SparkSession 實(shí)例。

上述內(nèi)容不清楚,則需要花一陣子找資料。

  1. import spark.implicits._ 
  2. val df_new = df.withColumn("x_new", $"x"

上述代碼構(gòu)造了一個(gè)新 df_new 對(duì)象,其中有 x_new 列與 x 列,兩列數(shù)值完全一致。

其次,我的運(yùn)算函數(shù)在哪里找呢?

答案是 org.apache.spark.sql.functions ,因?yàn)槭?col 對(duì)象,其可能沒(méi)有重載與常數(shù)數(shù)據(jù)類(lèi)型的 + - * / 運(yùn)算符,因此,如果我們 1 - $"x" 可能會(huì)報(bào)錯(cuò):因?yàn)?#"x" 是 col ,而 1 只是一個(gè) Int 。

我們要做的就是把 1 變成一個(gè) col :苦苦查閱資料后,我找到了 lit 方法,也是在 org.apache.spark.sql.functions 中。最終的方案如下。

  1. import spark.implicits._ 
  2. import org.apache.spark.sql.functions.{fit, exp, negate} 
  3. val df_result = df_raw_result 
  4.   .withColumn("x_sig"
  5.     lit(1.0) / (lit(1.0) + exp(negate($"x"))) 
  6.   ) 

其實(shí),實(shí)際的代碼比上面的還要復(fù)雜,因?yàn)?"x" 列里面其實(shí)是一個(gè) vector 對(duì)象,我直接 $"x"(0) 無(wú)法取出 $"x" 列中的向量的第一個(gè)元素,最后查到用 udf 可以實(shí)現(xiàn)列的函數(shù)。

  1. import spark.implicits._ 
  2. import org.apache.spark.sql.functions.{fit, exp, negate, udf} 
  3.  
  4. // 取向量中的第一個(gè)元素 
  5. val getItem = udf((v: org.apache.spark.ml.linalg.DenseVector, i: Int) => v(i)) 
  6.  
  7. val df_result = df_raw_result 
  8.   .withColumn("x_sig"
  9.     lit(1.0) / (lit(1.0) + exp(negate(getItem($"x", lit(0))))) 
  10.   ) 

python 和 scala ?

看起來(lái),似乎 python 下的操作更加簡(jiǎn)潔優(yōu)雅,但我更喜歡用 scala 書(shū)寫(xiě)這種級(jí)別的項(xiàng)目。

原因很簡(jiǎn)單, scala 對(duì)于類(lèi)型的嚴(yán)格要求已經(jīng)其從函數(shù)式編程那里借鑒來(lái)的思想,讓代碼寫(xiě)得太爽了。大部分問(wèn)題,編譯期就能發(fā)現(xiàn),而且配合上 IDEA 的自動(dòng)補(bǔ)全,真的很舒服。

目前為止,還沒(méi)有弄懂 udf 代表著什么,基礎(chǔ)語(yǔ)法與框架思想這里還是有待查缺補(bǔ)漏。

 

責(zé)任編輯:姜華 來(lái)源: Piper蛋窩
相關(guān)推薦

2013-11-27 09:26:02

遠(yuǎn)程公司

2021-04-19 17:32:34

Java內(nèi)存模型

2021-04-02 06:17:10

大數(shù)加減乘除數(shù)據(jù)結(jié)構(gòu)算法

2021-10-29 22:49:57

JavaScript開(kāi)發(fā)精度

2012-09-03 14:38:57

2018-04-18 09:07:24

iPhone X手機(jī)利潤(rùn)

2019-06-12 09:29:44

華為禁令開(kāi)發(fā)

2025-02-08 08:30:00

2018-08-09 09:00:34

Hadoop制造行業(yè)國(guó)內(nèi)企業(yè)

2012-01-11 11:13:06

惠普ProLiant

2016-11-09 16:52:20

Android 7.0谷歌安卓

2022-03-21 14:37:17

數(shù)據(jù)存儲(chǔ)服務(wù)器IT

2021-11-30 10:06:40

Windows 11Windows微軟

2014-06-25 09:26:16

創(chuàng)業(yè)創(chuàng)業(yè)失敗

2019-11-28 15:28:33

iOS 13蘋(píng)果更新

2014-08-25 11:25:52

WindowsLinux

2009-02-19 14:33:32

2023-04-13 07:55:11

項(xiàng)目Ladybird瀏覽器

2022-07-11 09:37:58

程序員出國(guó)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)