代码之家  ›  专栏  ›  技术社区  ›  Adeel Hashmi

转换Spark数据帧以进行ML处理

  •  0
  • Adeel Hashmi  · 技术社区  · 6 年前

    我已经编写了以下代码,将数据输入spark2.3中的机器学习算法。下面的代码运行良好。我需要加强这段代码能够转换不仅是3列,但任何数量的列,上传通过csv文件。例如,如果我已经加载了5列,那么如何将它们自动放入向量密度下面的命令,或者其他方法来生成相同的最终结果?有人知道怎么做吗?

    val data2 = spark.read.format("csv").option("header", 
    "true").load("/data/c7.csv")
    val goodBadRecords = data2.map(
      row =>{ 
      val n0 = row(0).toString.toLowerCase().toDouble
      val n1 = row(1).toString.toLowerCase().toDouble
      val n2 = row(2).toString.toLowerCase().toDouble
      val n3 = row(3).toString.toLowerCase().toDouble  
      (n0, Vectors.dense(n1,n2,n3))    
     }
    ).toDF("label", "features")
    

    谢谢

    当做,

    1 回复  |  直到 6 年前
        1
  •  1
  •   werner    6 年前

    A VectorAssembler 我可以做这项工作:

    VectorAssembler是一个转换器,它将给定的列列表组合成单个向量列。它对于将原始特征[…]组合成单个特征向量非常有用

    根据您的代码,解决方案如下所示:

    val data2 = spark.read.format("csv")
      .option("header","true")
      .option("inferSchema", "true") //1
      .load("/data/c7.csv")
    
    val fields = data2.schema.fieldNames
    
    val assembler = new VectorAssembler()
      .setInputCols(fields.tail) //2
      .setOutputCol("features") //3
    
    val goodBadRecords = assembler.transform(data2)
      .withColumn("label", col(fields(0))) //4
      .drop(fields:_*) //5
    

    1. 输入数据需要一个模式,因为VectorAssembler只接受以下输入列类型:所有数字类型、布尔类型和向量类型( same link ). 您似乎有一个带有双精度的csv,因此推断模式应该是可行的。当然,任何其他将字符串数据转换为double的方法也可以。
    2. 使用除第一列以外的所有列作为矢量汇编程序的输入
    3. 特征
    4. 创建一个名为 标签 作为第一列的副本