web-dev-qa-db-ja.com

java.lang.RuntimeException:Java.lang.Stringは、bigintまたはintのスキーマの有効な外部型ではありません

テキストファイルからデータフレームのスキーマを読み取っています。ファイルは次のようになります

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

そして、解析されたデータ型をSpark Sqlデータ型にマッピングしています。データフレームを作成するためのコードは-

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()

ただし、上記はStringTypeに対してのみ機能します。 IntegerTypeおよびLongTypeの場合、例外がスローされます-

Java.lang.RuntimeException:Java.lang.Stringはintのスキーマの有効な外部型ではありません

そして

Java.lang.RuntimeException:Java.lang.Stringは、bigintのスキーマの有効な外部型ではありません。

前もって感謝します!

12
Naren

文字列を数値型の列に保存しようとしています。

解析中に、文字列でエンコードされた数値データを適切な数値型にキャストする必要があります。

8
ImDarrenG

同じ問題が発生しましたが、その原因はRow.fromSeq()呼び出しです。

Stringの配列で呼び出された場合、結果のRowStringの行です。スキーマの2番目の列のタイプ(bigintまたはint)と一致しません。

Row.fromSeq(values: Seq[Any])の結果として有効なデータフレームを取得するには、values引数の要素がスキーマに対応するタイプである必要があります。

6
Vlad.Bachurin