aboutsummaryrefslogtreecommitdiff
path: root/mllib
diff options
context:
space:
mode:
authorGrzegorz Chilkiewicz <grzegorz.chilkiewicz@codilime.com>2016-02-02 11:16:24 -0800
committerJoseph K. Bradley <joseph@databricks.com>2016-02-02 11:16:24 -0800
commitb1835d727234fdff42aa8cadd17ddcf43b0bed15 (patch)
tree9cd6c3ed62a9212c15bee65e48c5f228ff6e3bdf /mllib
parent358300c795025735c3b2f96c5447b1b227d4abc1 (diff)
downloadspark-b1835d727234fdff42aa8cadd17ddcf43b0bed15.tar.gz
spark-b1835d727234fdff42aa8cadd17ddcf43b0bed15.tar.bz2
spark-b1835d727234fdff42aa8cadd17ddcf43b0bed15.zip
[SPARK-12711][ML] ML StopWordsRemover does not protect itself from column name duplication
Fixes problem and verifies fix by test suite. Also - adds optional parameter: nullable (Boolean) to: SchemaUtils.appendColumn and deduplicates SchemaUtils.appendColumn functions. Author: Grzegorz Chilkiewicz <grzegorz.chilkiewicz@codilime.com> Closes #10741 from grzegorz-chilkiewicz/master.
Diffstat (limited to 'mllib')
-rw-r--r--mllib/src/main/scala/org/apache/spark/ml/feature/StopWordsRemover.scala4
-rw-r--r--mllib/src/main/scala/org/apache/spark/ml/util/SchemaUtils.scala8
-rw-r--r--mllib/src/test/scala/org/apache/spark/ml/feature/StopWordsRemoverSuite.scala15
3 files changed, 19 insertions, 8 deletions
diff --git a/mllib/src/main/scala/org/apache/spark/ml/feature/StopWordsRemover.scala b/mllib/src/main/scala/org/apache/spark/ml/feature/StopWordsRemover.scala
index b93c9ed382..e53ef300f6 100644
--- a/mllib/src/main/scala/org/apache/spark/ml/feature/StopWordsRemover.scala
+++ b/mllib/src/main/scala/org/apache/spark/ml/feature/StopWordsRemover.scala
@@ -149,9 +149,7 @@ class StopWordsRemover(override val uid: String)
val inputType = schema($(inputCol)).dataType
require(inputType.sameType(ArrayType(StringType)),
s"Input type must be ArrayType(StringType) but got $inputType.")
- val outputFields = schema.fields :+
- StructField($(outputCol), inputType, schema($(inputCol)).nullable)
- StructType(outputFields)
+ SchemaUtils.appendColumn(schema, $(outputCol), inputType, schema($(inputCol)).nullable)
}
override def copy(extra: ParamMap): StopWordsRemover = defaultCopy(extra)
diff --git a/mllib/src/main/scala/org/apache/spark/ml/util/SchemaUtils.scala b/mllib/src/main/scala/org/apache/spark/ml/util/SchemaUtils.scala
index e71dd9eee0..76021ad8f4 100644
--- a/mllib/src/main/scala/org/apache/spark/ml/util/SchemaUtils.scala
+++ b/mllib/src/main/scala/org/apache/spark/ml/util/SchemaUtils.scala
@@ -71,12 +71,10 @@ private[spark] object SchemaUtils {
def appendColumn(
schema: StructType,
colName: String,
- dataType: DataType): StructType = {
+ dataType: DataType,
+ nullable: Boolean = false): StructType = {
if (colName.isEmpty) return schema
- val fieldNames = schema.fieldNames
- require(!fieldNames.contains(colName), s"Column $colName already exists.")
- val outputFields = schema.fields :+ StructField(colName, dataType, nullable = false)
- StructType(outputFields)
+ appendColumn(schema, StructField(colName, dataType, nullable))
}
/**
diff --git a/mllib/src/test/scala/org/apache/spark/ml/feature/StopWordsRemoverSuite.scala b/mllib/src/test/scala/org/apache/spark/ml/feature/StopWordsRemoverSuite.scala
index fb217e0c1d..a5b24c1856 100644
--- a/mllib/src/test/scala/org/apache/spark/ml/feature/StopWordsRemoverSuite.scala
+++ b/mllib/src/test/scala/org/apache/spark/ml/feature/StopWordsRemoverSuite.scala
@@ -89,4 +89,19 @@ class StopWordsRemoverSuite
.setCaseSensitive(true)
testDefaultReadWrite(t)
}
+
+ test("StopWordsRemover output column already exists") {
+ val outputCol = "expected"
+ val remover = new StopWordsRemover()
+ .setInputCol("raw")
+ .setOutputCol(outputCol)
+ val dataSet = sqlContext.createDataFrame(Seq(
+ (Seq("The", "the", "swift"), Seq("swift"))
+ )).toDF("raw", outputCol)
+
+ val thrown = intercept[IllegalArgumentException] {
+ testStopWordsRemover(remover, dataSet)
+ }
+ assert(thrown.getMessage == s"requirement failed: Column $outputCol already exists.")
+ }
}