Зависит от того, какой тип файла вы читаете.
Если это CSV-файл без заголовка, вам необходимо указать имя столбца и тип данных, используя схему.
Это CSV-файл с заголовком, поэтому вам нужно использовать "inferSchema" -> "true" в качестве опции при чтении файла. Эта опция автоматически выводит схему и типы данных. Однако тип данных автоматически определяется на основе первых нескольких записей фактических данных.
val df = spark.read.options(Map("inferSchema"->"true","delimiter"->"|","header"->"true")).csv(filePath)
По любой причине, если ваши первые несколько записей столбца имеют целочисленное значение, а другие записи имеют строку, то у вас возникнут проблемы, поэтому всегда рекомендуется явно указывать схему.
Ваш код работает как положено.
Оператор ниже автоматически выводит тип данных Int для возраста на основе данных Seq (("aa", 1), ("bb", 2))
val df = rdd.toDF("name","age")
Однако при преобразовании Dataframe в набор данных
val ds = rdd.map(line =>{Person(line._1,line._2)}).toDS()
Здесь вы конвертируете в Person, который имеет тип данных Long для поля age, следовательно, вы видите его длинным, как и ожидалось. Обратите внимание, что автоматическое преобразование из Int в Long выполняется Scala (повышенный состав), а не Spark.
Надеюсь, это прояснит !!
Ниже приведена хорошая информация о том, как предоставить сложную схему. надеюсь, это даст вам больше идей.
https://medium.com/@mrpowers/adding-structtype-columns-to-spark-dataframes-b44125409803
Спасибо