web-dev-qa-db-fra.com

java.lang.RuntimeException: Java.lang.String n'est pas un type externe valide pour le schéma bigint ou int

Je lis le schéma du bloc de données à partir d'un fichier texte. Le fichier ressemble à

id,1,bigint
price,2,bigint
sqft,3,bigint
Zip_id,4,int
name,5,string

et je mappe les types de données analysés aux types de données Spark Sql. Le code de création de la trame de données est -

var schemaSt = new ListBuffer[(String,String)]()
// read schema from file
for (line <- Source.fromFile("meta.txt").getLines()) {
  val Word = line.split(",")
  schemaSt += ((Word(0),Word(2)))
}

// map datatypes
val types = Map("int" -> IntegerType, "bigint" -> LongType)
      .withDefault(_ => StringType)
val schemaChanged = schemaSt.map(x => (x._1,types(x._2))

// read data source
val lines = spark.sparkContext.textFile("data source path")

val fields = schemaChanged.map(x => StructField(x._1, x._2, nullable = true)).toList

val schema = StructType(fields)

val rowRDD = lines
  .map(_.split("\t"))
  .map(attributes => Row.fromSeq(attributes))

// Apply the schema to the RDD
val new_df = spark.createDataFrame(rowRDD, schema)
new_df.show(5)
new_df.printSchema()

mais ce qui précède ne fonctionne que pour StringType. Pour IntegerType et LongType, il lève des exceptions -

Java.lang.RuntimeException: Java.lang.String n'est pas un type externe valide pour le schéma d'int

et

Java.lang.RuntimeException: Java.lang.String n'est pas un type externe valide pour le schéma de bigint.

Merci d'avance!

12
Naren

Vous essayez de stocker des chaînes dans des colonnes typées numériquement.

Vous devez convertir des données numériques codées en chaînes dans les types numériques appropriés lors de l'analyse.

8
ImDarrenG

J'ai eu le même problème et sa cause est l'appel Row.fromSeq().

S'il est appelé sur le tableau de String, le Row résultant est la ligne de String. Ce qui ne correspond pas au type de la 2ème colonne de votre schéma (bigint ou int).

Pour obtenir la trame de données valide à la suite de Row.fromSeq(values: Seq[Any]), les éléments de l'argument values doivent être du type correspondant à votre schéma.

6
Vlad.Bachurin