error: value columns is not a member of org.apache.spark.rdd.RDD[org.apache.spark.mllib.regression.LabeledPoint] val featureCols = train.columns.filter(_ != "label")
时间: 2023-09-20 10:10:01 浏览: 87
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
5星 · 资源好评率100%
这个错误是因为`train`是一个`RDD`对象,没有`columns`方法。如果你想使用`columns`方法来获取列名,需要将`train`转换为一个`DataFrame`对象。可以使用`toDF`方法将`RDD`转换为`DataFrame`,如下所示:
```scala
val trainData = spark.read.format("csv")
.option("header", "true")
.option("inferSchema", "true")
.load("path/to/train/data.csv")
.rdd // 转换为RDD
val header = trainData.first()
val train = trainData.filter(row => row != header)
.toDF(header.getAs[String]("label"), header.getAs[String]("feature1"), header.getAs[String]("feature2"), ...)
```
这里我们首先读取CSV文件并将其转换为一个`DataFrame`对象,然后使用`rdd`方法将其转换为一个`RDD`对象。接着,我们使用`first`方法获取第一行数据作为列名,然后使用`filter`方法过滤掉列名行,并使用`toDF`方法将`RDD`转换为`DataFrame`。这样就可以使用`columns`方法获取列名了。
如果你不想使用`DataFrame`,也可以使用`map`方法来获取特征列。如下所示:
```scala
val featureCols = trainData.map(_.features.toArray).take(1)(0).indices.map(i => s"feature$i")
```
这里我们使用`map`方法将`LabeledPoint`对象的特征列转换为一个数组,然后使用`take(1)`方法取第一行数据(也就是特征数组),最后使用`indices`方法获取特征数组的索引,再转换为列名。
阅读全文