Я думаю, что есть несколько способов решить эту проблему.
A) Определите схему для вашего CSV :
Например:
val customSchema = StructType(Array(
StructField("_c0", IntegerType),
StructField("_c1", IntegerType),
StructField("_c2", IntegerType),
StructField("_c3", StringType)))
Когда вы читаете CSV, добавьте параметр схемы с помощью StructType, который мы создали ранее
val mainDataFrame = spark.read.format("csv").option("header", "false").schema(customSchema).load("FileStore/tables/First_Spacial_Dataset_ByAris.csv")
Теперь, если мы посмотрим на вывод команды mainDataFrame.printSchema()
, мы увидим, что столбцы набираются в соответствии с вашим вариантом использования:
root
|-- _c0: integer (nullable = true)
|-- _c1: integer (nullable = true)
|-- _c2: integer (nullable = true)
|-- _c3: string (nullable = true)
Это означает, что мы можем фактически выполнить вашу исходную команду без получения ошибки.
trainingCoordDataFrame.select("_c2").map(r => r.getInt(0)).collect.toList
B) Приведите весь столбец к Int
Обратитесь к самому столбцу вместо имени столбца, а затем приведите столбец к IntegerType. Теперь, когда тип столбца - Int, вы можете снова использовать getInt там, где раньше произошел сбой:
trainingCoordDataFrame.select($"_c2".cast(IntegerType)).map(r => r.getInt(0)).collect.toList
C) Приведите каждое значение отдельно
Используйте карту для приведения или извлечения в качестве строки каждого отдельного значения, а затем приведите его к Int
trainingCoordDataFrame.select("_c2").map(r => r.getString(0).toInt).collect.toList