Spark Scala union не удается, хотя два кадра данных имеют одинаковую схему - PullRequest
0 голосов
/ 24 августа 2018

В Windows Spark 2.3.1 я пытаюсь объединить два кадра данных.Хотя оба имеют одну и ту же схему, я получаю сообщение об ошибке: «Объединение может быть выполнено только для таблиц с совместимыми типами столбцов». Я не понимаю, почему.Потому что я сделал второе преобразование, чтобы получить желаемую схему для второго кадра данных.

Мои коды:

import breeze.linalg._
import org.apache.spark.ml.feature.{StandardScaler, VectorAssembler}
import org.apache.spark.mllib.linalg.{Vector, Vectors}
import org.apache.spark.mllib.stat.Statistics
import org.apache.spark.sql.{SparkSession}
import org.apache.spark.sql.functions.{rand => random, udf,col}
import org.apache.spark.sql.types._

object MahalanobisDeneme {
  def main(args: Array[String]): Unit = {

    val spark = SparkSession.builder()
      .appName("KMeansZScore")
      .master("local[*]")
      .getOrCreate()
    import spark.implicits._

    val df = spark.range(0, 10).select("id").
      withColumn("uniform", random(10L)).
      withColumn("normal1", random(10L)).
      withColumn("normal2", random(11L))


   //df.show()

    val assembler = new VectorAssembler()
      .setInputCols(Array("uniform", "normal1", "normal2"))
      .setOutputCol("features")
    val assembledDF = assembler.transform(df)
    //assembledDF.show()


    val idFeaturesDF = assembledDF.select("id","features")
    idFeaturesDF.show(false)
    idFeaturesDF.printSchema()


    val outlierDF = spark.createDataFrame(Seq((10, Vectors.dense(5,5,5))))

    val outlierDF2 = outlierDF
      .withColumn("id", outlierDF.col("_1").cast("Long"))
        .withColumn("features",outlierDF.col("_2"))
    .select("id","features")

      outlierDF2.show()
    outlierDF2.printSchema()

    val unionedDF = idFeaturesDF.union(outlierDF2)
    unionedDF.show()
}
}

Вывод схемы для idFeaturesDF:

root
 |-- id: long (nullable = false)
 |-- features: vector (nullable = true)

Схема вывода для outlierDF2:

root
 |-- id: long (nullable = false)
 |-- features: vector (nullable = true)

Ниже приведены дополнительные журналы ошибок:

  Exception in thread "main" org.apache.spark.sql.AnalysisException: Union can only be performed on tables with the compatible column types. 
struct<type:tinyint,size:int,indices:array<int>,values:array<double>> <> 
struct<type:tinyint,size:int,indices:array<int>,values:array<double>> at the second column of the second table;;
    'Union
    :- AnalysisBarrier
    :     +- Project [id#0L, features#15]
    :        +- Project [id#0L, uniform#3, normal1#6, normal2#10, UDF(named_struct(uniform, uniform#3, normal1, normal1#6, normal2, normal2#10)) AS features#15]
    :           +- Project [id#0L, uniform#3, normal1#6, rand(11) AS normal2#10]
    :              +- Project [id#0L, uniform#3, rand(10) AS normal1#6]
    :                 +- Project [id#0L, rand(10) AS uniform#3]
    :                    +- Project [id#0L]
    :                       +- Range (0, 10, step=1, splits=Some(8))
    +- AnalysisBarrier
          +- Project [id#35L, features#39]
             +- Project [_1#31, _2#32, id#35L, _2#32 AS features#39]
                +- Project [_1#31, _2#32, cast(_1#31 as bigint) AS id#35L]
                   +- LocalRelation [_1#31, _2#32]

1 Ответ

0 голосов
/ 25 августа 2018

Попробуйте изменить import org.apache.spark.mllib.linalg.{Vector, Vectors} на import org.apache.spark.ml.linalg.{Vector, Vectors}.Они выглядят одинаково с printSchema(), но отличаются.

(я сравнил idFeaturesDF.head.get(1).getClass и outlierDF2.head.get(1).getClass, потому что сообщение жаловалось на второй столбец.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...