Scala 报错:java.lang.UnsupportedOperationException: fieldIndex on a Row without schema is undefined.
报错代码:
val row = Row("1", "2", "3")
row.getAs[String]("a")
错误原因:创建row的时候没有给定fieldIndex。
查看了一下Row的源码,创建row对象的时候,实际上是调用了new GenericRow()方法,创建了个GenericRow对象,然后这个对象继承了Row这个特质,在这个名为Row的这个特质里面:

有一个getAs的方法,这个方法就是我在上文中调用的方法(然后无情的报了错误,残忍!!!),这个方法里面调用了一个fieldIndex()方法,紧接着这下面就有一个fieldIndex的方法,只是单纯的抛出了一个异常,没有实现具体的相关内容,所以这就是为什么创建了一个row之后就报错的原因了。
之前提到了,创建一个新的row对象的时候实际上是创建了一个GenericRow的对象,然后在这个对象的定义代码的下方不远处可以看到一个这样的对象:

就是GenericRowWithSchema这个对象,它继承了GenericRow对象。同时重写了fieldIndex()方法,所以代码要改成这个样子:
val structType: StructType = new StructType(
Array(
StructField("a", IntegerType, true),
StructField("b", IntegerType, true),
StructField("c", IntegerType, true)
)
)
val row: GenericRowWithSchema = new GenericRowWithSchema(Array("1", "2", "3"), structType)
row.getAs[String](“a”)
嗯,这样的话,因为fieldIndex()方法已经被实现了,所以,调用getAs[T]()这个方法也就可以正常使用了!
当尝试访问无模式的Row对象字段时,Scala中可能会出现`java.lang.UnsupportedOperationException: fieldIndex on a Row without schema is undefined.`的错误。该错误源于在创建Row对象时未指定schema。解决方案是确保在创建Row对象时提供相应的schema,以避免调用未实现的fieldIndex方法导致异常。
292

被折叠的 条评论
为什么被折叠?



