Apache spark 用矢量汇编程序处理动态列
使用sparks向量汇编器,需要预先定义要组装的列 但是,如果在管道中使用向量汇编程序,前面的步骤将修改数据帧的列,那么如何在不手动硬编码所有值的情况下指定列 由于Apache spark 用矢量汇编程序处理动态列,apache-spark,pipeline,apache-spark-ml,Apache Spark,Pipeline,Apache Spark Ml,使用sparks向量汇编器,需要预先定义要组装的列 但是,如果在管道中使用向量汇编程序,前面的步骤将修改数据帧的列,那么如何在不手动硬编码所有值的情况下指定列 由于df.columns将不包含正确的值,因此当调用向量汇编程序的构造函数时,目前我看不到另一种方法来处理该问题或分割管道-这也是不好的,因为CrossValidator将不再正常工作 val vectorAssembler = new VectorAssembler() .setInputCols(df.columns
df.columns
将不包含正确的值,因此当调用向量汇编程序的构造函数时,目前我看不到另一种方法来处理该问题或分割管道-这也是不好的,因为CrossValidator将不再正常工作
val vectorAssembler = new VectorAssembler()
.setInputCols(df.columns
.filter(!_.contains("target"))
.filter(!_.contains("idNumber")))
.setOutputCol("features")
编辑
初始测向
---+------+---+-
|foo| id|baz|
+---+------+---+
| 0| 1 | A|
| 1|2 | A|
| 0| 3 | null|
| 1| 4 | C|
+---+------+---+
将进行如下转换。您可以看到,nan值将针对最常见的原始列进行插补,并衍生出一些特征,如此处所述isA
,如果baz为A,则为1,否则为0,如果最初为null,则为N
+---+------+---+-------+
|foo|id |baz| isA |
+---+------+---+-------+
| 0| 1 | A| 1 |
| 1|2 | A|1 |
| 0| 3 | A| n |
| 1| 4 | C| 0 |
+---+------+---+-------+
稍后在管道中,使用stringIndexer使数据适合ML/vectorAssembler
isA
不存在于原始df中,但不是“唯一”输出列此帧中的所有列(除foo和id列外)都应由向量汇编程序进行转换
我希望现在更清楚。如果我正确理解您的问题,答案将非常简单明了,您只需使用上一个转换器中的
.getOutputCol
示例(来自官方文件):
如果我正确理解您的问题,答案将非常简单明了,您只需使用上一个转换器中的
.getOutputCol
示例(来自官方文件):
我创建了一个定制的向量汇编程序(原版的1:1副本),然后将其更改为包含所有列,但传递给排除的列除外 编辑 更清楚一点
def setInputColsExcept(value: Array[String]): this.type = set(inputCols, value)
指定应排除哪些列。然后
val remainingColumns = dataset.columns.filter(!$(inputCols).contains(_))
在transform中,方法是筛选所需的列。我创建了一个自定义向量汇编程序(原始的1:1副本),然后将其更改为包含所有列,但传递给排除的列除外 编辑 更清楚一点
def setInputColsExcept(value: Array[String]): this.type = set(inputCols, value)
指定应排除哪些列。然后
val remainingColumns = dataset.columns.filter(!$(inputCols).contains(_))
在转换中,方法是过滤所需的列。不幸的是,这并没有像我修改一些原始列那样简单,例如nan填充和创建一些新列。因此,没有单一的“输出”列,而是有多个。向量汇编程序是估计器将所有数据转换为单个列之前的最后一步。不幸的是,它并没有那么简单,因为我正在修改一些原始列,例如nan填充和创建一些新列。因此,没有单一的“输出”列,而是有多个。向量汇编程序是估计器将所有内容转换为单个列之前的最后一步。您是如何构建或添加该列的?通过df.withcolumn这是您要寻找的答案吗?因此,这实际上超出了您的管道范围。但是为什么?没有内部集成在定制的估算器中,所以你实际上说的“管道”,你不是指实际的管道API?你是如何构建或添加该列的?通过df.withcolumn,这是你要寻找的答案吗?因此,这实际上在你的管道之外。但是为什么呢?没有内部集成在定制的API中,所以你实际上所说的“管道”,并不是指实际的管道API?你能把这个答案更详细一点吗?这是太高的层次,无法在将来帮助其他人。我正试图在pyspark中做同样的事情。你能再详细一点吗?你能再详细一点回答吗?这是太高的层次,无法在将来帮助其他人。我正试图在pyspark中做同样的事情。你能再详细一点吗?