Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何在Spark数据帧中将字符串值编码为数值_Scala_Apache Spark_Apache Spark Mllib - Fatal编程技术网

Scala 如何在Spark数据帧中将字符串值编码为数值

Scala 如何在Spark数据帧中将字符串值编码为数值,scala,apache-spark,apache-spark-mllib,Scala,Apache Spark,Apache Spark Mllib,我有一个包含两列的数据框: df = Col1 Col2 aaa bbb ccc aaa 我想把字符串值编码成数值。我是这样做的: import org.apache.spark.ml.feature.{OneHotEncoder, StringIndexer} val indexer1 = new StringIndexer() .setInputCol("Col1") .setO

我有一个包含两列的数据框:

df = 
  Col1   Col2
  aaa    bbb
  ccc    aaa
我想把字符串值编码成数值。我是这样做的:

import org.apache.spark.ml.feature.{OneHotEncoder, StringIndexer}

val indexer1 = new StringIndexer()
                    .setInputCol("Col1")
                    .setOutputCol("Col1Index")
                    .fit(df)

val indexer2 = new StringIndexer()
                    .setInputCol("Col2")
                    .setOutputCol("Col2Index")
                    .fit(df)

val indexed1 = indexer1.transform(df)
val indexed2 = indexer2.transform(df)

val encoder1 = new OneHotEncoder()
                    .setInputCol("Col1Index")
                    .setOutputCol("Col1Vec")

val encoder2 = new OneHotEncoder()
                    .setInputCol("Col2Index")
                    .setOutputCol("Col2Vec")

val encoded1 = encoder1.transform(indexed1)
encoded1.show()

val encoded2 = encoder2.transform(indexed2)
encoded2.show()
问题是
aaa
在两列中以不同的方式编码。 如何对数据帧进行编码以正确编码新数据帧,例如:

df_encoded = 
   Col1   Col2
   1      2
   3      1

两列上的单个列
索引器

val df = Seq(("aaa", "bbb"), ("ccc", "aaa")).toDF("col1", "col2")

val indexer = new StringIndexer().setInputCol("col").fit(
   df.select("col1").toDF("col").union(df.select("col2").toDF("col"))
)
并在每列上应用副本

import org.apache.spark.ml.param.ParamMap

val result = Seq("col1", "col2").foldLeft(df){
  (df, col) => indexer
    .copy(new ParamMap()
      .put(indexer.inputCol, col)
      .put(indexer.outputCol, s"${col}_idx"))
    .transform(df)
}

result.show
// +----+----+--------+--------+
// |col1|col2|col1_idx|col2_idx|
// +----+----+--------+--------+
// | aaa| bbb|     0.0|     1.0|
// | ccc| aaa|     2.0|     0.0|
// +----+----+--------+--------+

两列上的单个列
索引器

val df = Seq(("aaa", "bbb"), ("ccc", "aaa")).toDF("col1", "col2")

val indexer = new StringIndexer().setInputCol("col").fit(
   df.select("col1").toDF("col").union(df.select("col2").toDF("col"))
)
并在每列上应用副本

import org.apache.spark.ml.param.ParamMap

val result = Seq("col1", "col2").foldLeft(df){
  (df, col) => indexer
    .copy(new ParamMap()
      .put(indexer.inputCol, col)
      .put(indexer.outputCol, s"${col}_idx"))
    .transform(df)
}

result.show
// +----+----+--------+--------+
// |col1|col2|col1_idx|col2_idx|
// +----+----+--------+--------+
// | aaa| bbb|     0.0|     1.0|
// | ccc| aaa|     2.0|     0.0|
// +----+----+--------+--------+

您可以让自己进行转换,示例是我的pyspark代码

  • 将转换模型训练为clf
  • sindex\u pro=StringIndexer(inputCol='StringCol',outputCol='StringCol\u c',stringOrderType=“frequencyDesc”,handleInvalid=“keep”).fit(省测向)`
    
  • 定义clf中的自耦变压器负载
  • 从pyspark.sql.functions导入col
    从pyspark.ml导入转换器
    从pyspark.sql导入数据帧
    Si类(变压器):
    定义初始化(self、clf、col_name):
    super(SelfSI,self)。\uuuu init\uuuuu()
    self.clf=clf
    self.col\u name=col\u name
    def rename_col(自身、df、反向=假):
    或_name='StringCol'
    col\u name=self.col\u name
    如果相反:
    df=df.withColumnRename(或列名称、列名称)
    或_name=col_name+“_c”
    col_name='StringCol_c'
    df=df.WithColumnRename(列名称或列名称)
    返回df
    def_变换(self,df:DataFrame)->DataFrame:
    df=自我。重命名_col(df)
    df=自循环变换(df)
    df=self.rename_col(df,inverse=True)
    返回df
    
  • 根据您需要的列名定义模型
  • pro\u si=SelfSI(sindex\u pro,'pro\u name')
    pro_si.transform(df_或)
    #或管道
    模型=管道(阶段=[pro_-si,pro_-si2])。拟合(df_或)
    模型转换(df_或)
    #结果像
    省|市|省|名|市|名||
    +-------------+---------+---------------+-----------+
    |           河北|       保定|           23.0|       18.0|
    |           河北|       张家|           23.0|      213.0|
    |           河北|       承德|           23.0|      126.0|
    |           河北|       沧州|           23.0|        6.0|
    |           河北|       廊坊|           23.0|       26.0|
    |           北京|       北京|           13.0|      107.0|
    |           天津|       天津|           10.0|       85.0|
    |           河北|       石家|           23.0|      185.0|
    
    您可以让自己进行转换,例如我的Pypark代码

  • 将转换模型训练为clf
  • sindex\u pro=StringIndexer(inputCol='StringCol',outputCol='StringCol\u c',stringOrderType=“frequencyDesc”,handleInvalid=“keep”).fit(省测向)`
    
  • 定义clf中的自耦变压器负载
  • 从pyspark.sql.functions导入col
    从pyspark.ml导入转换器
    从pyspark.sql导入数据帧
    Si类(变压器):
    定义初始化(self、clf、col_name):
    super(SelfSI,self)。\uuuu init\uuuuu()
    self.clf=clf
    self.col\u name=col\u name
    def rename_col(自身、df、反向=假):
    或_name='StringCol'
    col\u name=self.col\u name
    如果相反:
    df=df.withColumnRename(或列名称、列名称)
    或_name=col_name+“_c”
    col_name='StringCol_c'
    df=df.WithColumnRename(列名称或列名称)
    返回df
    def_变换(self,df:DataFrame)->DataFrame:
    df=自我。重命名_col(df)
    df=自循环变换(df)
    df=self.rename_col(df,inverse=True)
    返回df
    
  • 根据您需要的列名定义模型
  • pro\u si=SelfSI(sindex\u pro,'pro\u name')
    pro_si.transform(df_或)
    #或管道
    模型=管道(阶段=[pro_-si,pro_-si2])。拟合(df_或)
    模型转换(df_或)
    #结果像
    省|市|省|名|市|名||
    +-------------+---------+---------------+-----------+
    |           河北|       保定|           23.0|       18.0|
    |           河北|       张家|           23.0|      213.0|
    |           河北|       承德|           23.0|      126.0|
    |           河北|       沧州|           23.0|        6.0|
    |           河北|       廊坊|           23.0|       26.0|
    |           北京|       北京|           13.0|      107.0|
    |           天津|       天津|           10.0|       85.0|
    |           河北|       石家|           23.0|      185.0|
    
    如何解码
    col1_idx
    col2_idx
    返回原始
    df
    值?如何解码
    col1_idx
    col2_idx
    返回原始
    df
    值?