#scala #apache-spark
Вопрос:
У меня есть следующий код, который создает векторную сборку:
val allColsExceptOceanProximity: Array[String] = dfRaw.drop("ocean_proximity").columns
val assembler = new VectorAssembler()
//.setInputCols(Array("longitude", "latitude", "housing_median_age", "total_rooms", "population", "households", "population", "median_income", "median_house_value"))
.setInputCols(allColsExceptOceanProximity)
.setOutputCol("features")
Если я использую массив со статическими типами столбцов, он работает. Когда я динамически передаю массив, он как бы выходит из строя со следующей ошибкой:
org.apache.spark.SparkException: Job aborted due to stage failure: Task 2 in stage 1763.0 failed 1 times, most recent failure: Lost task 2.0 in stage 1763.0 (TID 100292) (192.168.0.35 executor driver): org.apache.spark.SparkException: Failed to execute user defined function(VectorAssembler$Lambda$4540/1415205968: (struct<longitude:double,latitude:double,housing_median_age:double,total_rooms:double,total_bedrooms:double,population:double,households:double,median_income:double,median_house_value:double>) => struct<type:tinyint,size:int,indices:array<int>,values:array<double>>)
at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage2.agg_doAggregateWithKeysOutput_0$(Unknown Source)
at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage2.processNext(Unknown Source)
at org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43)
at org.apache.spark.sql.execution.WholeStageCodegenExec$anon$1.hasNext(WholeStageCodegenExec.scala:755)
at scala.collection.Iterator$anon$10.hasNext(Iterator.scala:458)
at scala.collection.Iterator$anon$10.hasNext(Iterator.scala:458)
at scala.collection.Iterator$anon$10.hasNext(Iterator.scala:458)
at scala.collection.Iterator$anon$10.hasNext(Iterator.scala:458)
at scala.collection.Iterator.foreach(Iterator.scala:941)
Почему это так? Есть какие-нибудь идеи. Ожидается ли тип Varargs? Я нахожусь в своем ноутбуке и не обладаю преимуществами IDE.
ИЗМЕНИТЬ: Добавлена схема:
root
|-- longitude: double (nullable = true)
|-- latitude: double (nullable = true)
|-- housing_median_age: double (nullable = true)
|-- total_rooms: double (nullable = true)
|-- total_bedrooms: double (nullable = true)
|-- population: double (nullable = true)
|-- households: double (nullable = true)
|-- median_income: double (nullable = true)
|-- median_house_value: double (nullable = true)
|-- ocean_proximity: string (nullable = true)
Комментарии:
1. можете ли вы включить схему dfRaw DF?
2. Просто отредактировал сообщение со схемой.
3. Я думаю, что в вашем коде есть что-то еще, что приводит к этой ошибке, потому что я могу запустить некоторый тестовый фрейм данных с жестко закодированными столбцами, а также динамическими столбцами, как вы пытаетесь, и это не дает никаких ошибок.
4. Это кажется хорошим. Следует отметить, что столбцы могут быть обнулены. Создайте образец с ненулевыми значениями и повторите попытку
5. Ты прав. В моем образце была колонка, в которой было несколько нулевых значений.