Грешка при искра: Неподдържан буквален клас клас sql.catalyst.expressions.GenericRowWithSchema
val crimeDF = spark.read.option("header", "true").csv("crime_data.csv")
crimeDF.show(5)
var a = crimeDF.select(max($"IncidntNum")).take(1)
println(a(0).toString)
a: Array[org.apache.spark.sql.Row] = Array([991309046])
[991309046]
Изпълнявам тази команда:
crimeDF.where($"IncidntNum ===" +a(0))
но получавате тази грешка:
java.lang.RuntimeException: Unsupported literal type class org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema [991309046]
at org.apache.spark.sql.catalyst.expressions.Literal$.apply(literals.scala:77)
at org.apache.spark.sql.catalyst.expressions.Literal$$anonfun$create$2.apply(literals.scala:163)
at org.apache.spark.sql.catalyst.expressions.Literal$$anonfun$create$2.apply(literals.scala:163)
at scala.util.Try.getOrElse(Try.scala:79)
at org.apache.spark.sql.catalyst.expressions.Literal$.create(literals.scala:162)
at org.apache.spark.sql.functions$.typedLit(functions.scala:112)
at org.apache.spark.sql.functions$.lit(functions.scala:95)
at org.apache.spark.sql.Column.$plus(Column.scala:648)
... 76 elided
Отговори:
3 за отговор № 1Опитваш се да преминеш цялото Row
като буквално. Извличайте стойността от реда, преди да я използвате в следващите заявки:
crimeDF.where($"IncidntNum" === a(0).getInt(0))
или
crimeDF.where($"IncidntNum" === a(0).getString(0))
в зависимост от това дали тези числа в продукцията ви са Int
s или String
с.
1 за отговор № 2
Трябва да се правиш
var a = crimeDF.select(max($"IncidntNum")).take(1)(0).getAs[Int](0)
и тогава
crimeDF.where($"IncidntNum" === a)
или
crimeDF.where($"IncidntNum" === lit(a))