zoukankan      html  css  js  c++  java
  • Spark VectorSizeHint

    1、概念

    一种特性转换器,可将尺寸信息添加到矢量列的元数据中。 VectorAssembler需要为其输入列提供大小信息,并且在没有此元数据的情况下不能在流数据帧上使用。
    注意:VectorSizeHint修改`inputCol`以包括大小元数据,并且没有outputCol。

    2、code

    package com.home.spark.ml
    
    import org.apache.spark.SparkConf
    import org.apache.spark.ml.feature.{VectorAssembler, VectorSizeHint}
    import org.apache.spark.ml.linalg.Vectors
    import org.apache.spark.sql.SparkSession
    
    /**
      * 有时为VectorType的列显式指定向量的大小可能很有用。
      * 例如,VectorAssembler使用其输入列中的大小信息来为其输出列生成大小信息和元数据。尽管在某些情况下,可以通过检查列的内容来获取此信息,
      * 但是在流数据帧中,只有在流启动后,内容才可用。
      * VectorSizeHint允许用户显式指定列的向量大小,以便VectorAssembler或可能需要知道向量大小的其他转换器可以将该列用作输入。
      *
      * 要使用VectorSizeHint,用户必须设置inputCol和size参数。
      * 将此转换器应用于数据框将生成一个新的数据框,其中包含用于inputCol的更新元数据,以指定矢量大小。
      * 生成的数据帧上的下游操作可以使用Meatadata获得此大小。
      *
      * VectorSizeHint也可以采用可选的handleInvalid参数,当vector列包含null或错误大小的vector时,该参数控制其行为。
      * 默认情况下,handleInvalid设置为“错误”,指示应引发异常。
      * 此参数也可以设置为“跳过”,指示应从结果数据框中过滤出包含无效值的行,或“乐观”,指示不应检查该列的无效值,而应保留所有行。
      * 请注意,使用“乐观”可能导致结果数据帧处于不一致状态,即:VectorVectorHint列应用于的元数据与该列的内容不匹配。
      * 用户应注意避免这种不一致的状态。
      **/
    object Ex_VectorSizeHint {
      def main(args: Array[String]): Unit = {
        val conf: SparkConf = new SparkConf(true).setMaster("local[2]").setAppName("spark ml")
        val spark = SparkSession.builder().config(conf).getOrCreate()
    
        val dataset = spark.createDataFrame(
          Seq(
            (0, 18, 1.0, Vectors.dense(0.0, 10.0, 0.5), 1.0),
            (0, 18, 1.0, Vectors.dense(0.0, 10.0), 0.0))
        ).toDF("id", "hour", "mobile", "userFeatures", "clicked")
    
        val sizeHint = new VectorSizeHint()
          .setInputCol("userFeatures")
          .setHandleInvalid("skip")
          .setSize(3)
    
        val datasetWithSize = sizeHint.transform(dataset)
        println("Rows where 'userFeatures' is not the right size are filtered out")
        datasetWithSize.show(false)
    
        val assembler = new VectorAssembler()
          .setInputCols(Array("hour", "mobile", "userFeatures"))
          .setOutputCol("features")
    
        // This dataframe can be used by downstream transformers as before
        val output = assembler.transform(datasetWithSize)
        println("Assembled columns 'hour', 'mobile', 'userFeatures' to vector column 'features'")
        output.select("*").show(false)
    
        spark.stop()
      }
    }

    raw data ...
    +---+----+------+--------------+-------+
    |id |hour|mobile|userFeatures  |clicked|
    +---+----+------+--------------+-------+
    |0  |18  |1.0   |[0.0,10.0,0.5]|1.0    |
    |0  |18  |1.0   |[0.0,10.0]    |0.0    |
    +---+----+------+--------------+-------+

    Rows where 'userFeatures' is not the right size are filtered out
    +---+----+------+--------------+-------+
    |id |hour|mobile|userFeatures  |clicked|
    +---+----+------+--------------+-------+
    |0  |18  |1.0   |[0.0,10.0,0.5]|1.0    |
    +---+----+------+--------------+-------+

    Assembled columns 'hour', 'mobile', 'userFeatures' to vector column 'features'
    +---+----+------+--------------+-------+-----------------------+
    |id |hour|mobile|userFeatures  |clicked|features               |
    +---+----+------+--------------+-------+-----------------------+
    |0  |18  |1.0   |[0.0,10.0,0.5]|1.0    |[18.0,1.0,0.0,10.0,0.5]|
    +---+----+------+--------------+-------+-----------------------+
  • 相关阅读:
    vue init定制团队模板之meta.js/meta.json写法入门
    使用vux组件库常见报错($t)处理
    vue filter使用方法
    vue init定制团队模板使用方法
    java.lang.String (JDK1.8)
    JDK 1.8 源码阅读和理解
    JAVA 实现tail -f 日志文件监控功能
    JAVA实现上传文件到服务器、删除服务器文件
    JAVA 解析、编辑nginx.conf
    新旧apache HttpClient 获取httpClient方法
  • 原文地址:https://www.cnblogs.com/asker009/p/12208385.html
Copyright © 2011-2022 走看看