java.lang.RuntimeException:java.lang.String不是bigint或int

时间:2017-02-01 02:04:06

标签: scala apache-spark apache-spark-sql spark-dataframe

我正在从文本文件中读取数据框架的模式。该文件看起来像

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架构的有效外部类型。

提前致谢!

2 个答案:

答案 0 :(得分:8)

您正尝试将字符串存储在数字类型的列中。

您需要在解析时将字符串编码的数字数据转换为适当的数字类型。

答案 1 :(得分:6)

我遇到了同样的问题,其原因是Row.fromSeq()电话。

如果在String数组上调用它,则生成的RowString的行。哪个与架构中第二列的类型不匹配(bigintint)。

为了获得Row.fromSeq(values: Seq[Any])的有效数据帧,values参数的元素必须是与您的模式对应的类型。