Мне нужна помощь, чтобы понять итерацию в 'scala'.У меня есть фрейм данных, который имеет другой тип данных (Int, String, Date, Long).Я хочу прочитать данные каждой строки в цикле.если данные столбца, если данные столбца не совпадают с типом данных, то правильный тип данных.Затем я хочу обновить значение столбца с нуля.
Я устал читать каждое значение столбца и проверить с соответствующим типом данных Like 'ID Столбец: целочисленный тип, AirName: строковый тип, Place: строковый тип,TakeoffDate: Date 'type.My Входной набор данных:
+-----+-------+-----+-----------+
| ID|AirName|Place|TakeoffDate|
| 1| Delta| Aus| 1/11/18|
| 2| Delta| | 10/5/19|
|Three| null| New| 15/10/2018|
| 4| JetAir| Aus| 11/6/15|
+-----+-------+-----+-----------+
Здесь Three - строковый тип, но ID, который мы объявили как Int.Так что я хочу заменить три на ноль.аналогичный другой столбец в цикле.
Я прочитал данные из файла и создал фрейм данных.Теперь я хочу проверить каждую строку и каждый столбец с соответствующим типом данных.если тип данных не совпадает, я хочу заменить этот столбец на ноль.
Но это не работает для меня.
val myFile = sc.textFile("/FileStore/tables/Airline__2_-14f6c.txt")
import org.apache.spark.sql.types._
case class Test(ID:Int,AirName:String,Place:String,TakeoffDate:String)
val df= myFile.map(x => x.split(",") ).map( x=> Test(x(0).toInt,x(1),x(2),x(3)) ).toDF()
def isInt(in: Integer): Option[Int] = {
try {
Some(Integer.parseInt(in))
} catch {
case e: NumberFormatException => None
}
}
rows.map{
case(ID) => if (isInt(ID).isEmpty (ID,ErrorCodes.NOT_INT))
{
println("yes")
}
else ((Int)ID, None)
{
println("no")
}
}
Expected Output
+-----+-------+-----+-----------+
| ID|AirName|Place|TakeoffDate|
| 1| Delta| Aus| 1/11/18|
| 2| Delta| null| 10/5/19|
|null | null| New| null |
| 4| JetAir| Aus| 11/6/15|
+-----+-------+-----+-----------+