日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

spark ml中一个比较通用的transformer

發布時間:2023/11/27 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spark ml中一个比较通用的transformer 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  spark ml中有許多好用的transformer,很方便用來做特征的處理,比如Tokenizer, StopWordsRemover等,具體可參看文檔:http://spark.apache.org/docs/2.1.0/ml-features.html . 但是呢,這些都是一些特定的操作,組內的同事提了一個需求,能不能寫一個通用的模板,用來做特征轉化,讓代碼看起來比較整潔規整。后來經過參考spark中那些transformer的寫法, 弄了一個比較通用的模板,只能說比較通用,還是有些需求不能滿足的。模板其實很簡單,幾行代碼就搞定了,如下:

  

import org.apache.spark.ml.UnaryTransformer
import org.apache.spark.ml.util.{DefaultParamsWritable, Identifiable}
import org.apache.spark.sql.{DataFrame, SparkSession}
import org.apache.spark.sql.types._// 對泛型參數進行說明: I表示 InputCol的類型, O 表示OutputCol的類型
class KgTransformer[I, O](override val uid: String) extends UnaryTransformer[I, O, KgTransformer[I, O]] with DefaultParamsWritable {var kgOutputDataType: DataType = _var f: I => O = _// 第一個參數表示OutputCol的類型, 這里需要使用spark ml中類型,其它更多的使用方式可以參考官方文檔或者其它源碼中寫的相似代碼// 第二個參數表示 作用在 InputCol上的操作函數def this(kgOutputDataType: DataType, f: I => O) = {this(Identifiable.randomUID("kgTransformer"))this.kgOutputDataType = kgOutputDataTypethis.f = f}override def outputDataType: DataType = kgOutputDataType//自定義實現驗證, 這里默認沒驗證override def validateInputType(inputType: DataType): Unit = {}// 這里是申明一個名為createTransformFunc的函數, 返回值是一個函數:返回一個參數類型為I, 返回值類型為 O 的函數override def createTransformFunc: (I) => O = {//其實這玩意就是想搞一個map的函數體來(in: I) => f(in) //返回一個函數
    }
}

以上這個工具類模型就寫好了,以后對于一些操作都可以用這種通用的寫法,如下:

// 使用方式舉例:
object TestKgTransformer {def main(args: Array[String]) {val spark = SparkSession.builder().appName("TestKgTransformer").master("local").getOrCreate()spark.sparkContext.setLogLevel("ERROR")import spark.implicits._val data: DataFrame = spark.createDataFrame(Seq((0.0, "a;c;e"),(1.0, "b;f;g"),(2.0, "c;c"),(3.0, "c;k;f;e;c"))).toDF("id", "words")data.show(false)// 輸入列為id, 輸出列為kgIdOut, 操作為給 id列的值加上5val kgTrans1 = new KgTransformer[Double, Double](DataTypes.DoubleType, _ + 5).setInputCol("id").setOutputCol("kgIdOut")val res1 = kgTrans1.transform(data)res1.show(false)// 輸入列為words, 輸出列為 kgWordsOut ,操作為對 words 進行切割val kgTrans2 = new KgTransformer[String, Array[String]](new ArrayType(StringType, true), _.split("\\;")).setInputCol("words").setOutputCol("kgWordsOut")kgTrans2.transform(res1).show(false)spark.stop()}
}

就只有這么多啦,代碼量很少,不過挺實用的,上面的代碼是可以直接運行的。

結果如下:

+---+---------+
|id |words |
+---+---------+
|0.0|a;c;e |
|1.0|b;f;g |
|2.0|c;c |
|3.0|c;k;f;e;c|
+---+---------+

+---+---------+-------+
|id |words |kgIdOut|
+---+---------+-------+
|0.0|a;c;e |5.0 |
|1.0|b;f;g |6.0 |
|2.0|c;c |7.0 |
|3.0|c;k;f;e;c|8.0 |
+---+---------+-------+

+---+---------+-------+---------------+
|id |words |kgIdOut|kgWordsOut |
+---+---------+-------+---------------+
|0.0|a;c;e |5.0 |[a, c, e] |
|1.0|b;f;g |6.0 |[b, f, g] |
|2.0|c;c |7.0 |[c, c] |
|3.0|c;k;f;e;c|8.0 |[c, k, f, e, c]|
+---+---------+-------+---------------+

?

?

轉載于:https://www.cnblogs.com/wuxilc/p/9290951.html

總結

以上是生活随笔為你收集整理的spark ml中一个比较通用的transformer的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。