我正在为某些测试手动创建数据帧.创建它的代码是:
case class input(id:Long, var1:Int, var2:Int, var3:Double)
val inputDF = sqlCtx
.createDataFrame(List(input(1110,0,1001,-10.00),
input(1111,1,1001,10.00),
input(1111,0,1002,10.00)))
Run Code Online (Sandbox Code Playgroud)
架构看起来像这样:
root
|-- id: long (nullable = false)
|-- var1: integer (nullable = false)
|-- var2: integer (nullable = false)
|-- var3: double (nullable = false)
Run Code Online (Sandbox Code Playgroud)
我想为这些变量中的每一个制作'nullable = true'.如何从一开始就声明它或在创建新数据帧后将其切换?
我正在尝试在多列上应用字符串索引器。这是我的代码
val stringIndexers = Categorical_Model.map { colName =>new StringIndexer().setInputCol(colName).setOutputCol(colName + "_indexed")}
var dfStringIndexed = stringIndexers(0).fit(df3).transform(df3) // 'fit's a model then 'transform's data
for(x<-1 to stringIndexers.length-1)
{dfStringIndexed = stringIndexers(x).fit(dfStringIndexed).transform(dfStringIndexed)
}
dfStringIndexed = dfStringIndexed.drop(Categorical_Model: _*)
Run Code Online (Sandbox Code Playgroud)
Schema 显示所有可空的列都为 false
stringIndexers 数组显示如下
stringIndexers: Array[org.apache.spark.ml.feature.StringIndexer] = Array(strIdx_c53c3bdf464c, strIdx_61e685c520f7, strIdx_d6e59b2fc69d, ......)
dfStringIndexed.show(10)
Run Code Online (Sandbox Code Playgroud)
这会引发以下错误
org.apache.spark.SparkException: Failed to execute user defined function($anonfun$9: (string) => double)
Run Code Online (Sandbox Code Playgroud)
为什么显示打印模式但没有可用数据。
更新:如果我像这样手动循环字符串索引器而不是循环。此代码有效。这很奇怪。
var dfStringIndexed = stringIndexers(0).fit(df3).transform(df3) // 'fit's a model then 'transform's data
dfStringIndexed = stringIndexers(1).fit(dfStringIndexed).transform(dfStringIndexed)
dfStringIndexed = stringIndexers(2).fit(dfStringIndexed).transform(dfStringIndexed)
dfStringIndexed = stringIndexers(3).fit(dfStringIndexed).transform(dfStringIndexed)
dfStringIndexed …Run Code Online (Sandbox Code Playgroud)