Вам нужно привести все столбцы как строку, если inferSchema уже используется.
Сопоставьте длину с df.columns, чтобы вы могли обрабатывать это динамически.
Проверьте это:
scala> val df = Seq(("A", 25,9900999999L),("B", 26,7654890234L),("C", 27,5643217897L)).toDF("Name","age","phonenumber")
df: org.apache.spark.sql.DataFrame = [Name: string, age: int ... 1 more field]
scala> df.show(false)
+----+---+-----------+
|Name|age|phonenumber|
+----+---+-----------+
|A |25 |9900999999 |
|B |26 |7654890234 |
|C |27 |5643217897 |
+----+---+-----------+
scala> val widths = Array(5,3,10)
widths: Array[Int] = Array(5, 3, 10)
scala> df.columns.zip(widths)
res235: Array[(String, Int)] = Array((Name,5), (age,3), (phonenumber,10))
scala> df.columns.zip(widths).foldLeft(df){ (acc,x) => acc.withColumn(x._1,rpad( trim(col(x._1).cast("string")),x._2," ")) }.show(false)
+-----+---+-----------+
|Name |age|phonenumber|
+-----+---+-----------+
|A |25 |9900999999 |
|B |26 |7654890234 |
|C |27 |5643217897 |
+-----+---+-----------+
Для проверки заполнения ..
scala> df.columns.zip(widths).foldLeft(df){ (acc,x) => acc.withColumn(x._1,rpad( trim(col(x._1).cast("string")),x._2,"-")) }.show(false)
+-----+---+-----------+
|Name |age|phonenumber|
+-----+---+-----------+
|A----|25-|9900999999 |
|B----|26-|7654890234 |
|C----|27-|5643217897 |
+-----+---+-----------+
scala>