我知道你会期待代码,但代码看起来很好,我无法理解会出现什么问题。我会解释这个问题,让我们看看你是否可以告诉我,我是否遗漏了一些明显的东西。
我为Row
编写了一个隐式类,这个函数使用row.schema
来获取模式。虽然row.schema
总是在隐式类中返回null
,但是行对象是否具有模式,而在同一个包含单元测试的类中返回实际模式(我使用{{ 1}}用于单元测试)。这就是在单元测试中构造行的方式。
FlatSpec with Matchers
我检查了Spark代码库中的源代码,这就是val schema = StructType(
StructField("col1", StringType) ::
StructField("col2", DoubleType) ::
StructField("col3", IntegerType) ::
Nil)
val values = Array("value1", 1.0, 1)
val row: Row = new GenericRowWithSchema(values, schema)
函数的实现方式。
schema
让我更加困惑。有什么指针吗?
编辑:我应该知道没有代码没有真正帮助。所以这是代码。查看def schema: StructType = null
中的getAsOpt[T](i)
(here)和getAsOpt[T](fieldName)
(here)项Row
以及相应的测试this code。
以下是失败,失败,
的方法[info] - getAsOpt[T]() can get values using field names. *** FAILED *** (8 milliseconds)
[info] None was not equal to Some("value1") (RowTest.scala:85)
...
[info] - getAsOpt[T] retrieves an Optional value if the fieldName exists else returns None *** FAILED *** (1 millisecond)
[info] None was not equal to Some("value1") (RowTest.scala:91)
...
[info] - getAsOpt[T] retrieves an Optional value if class cast is successful else returns None *** FAILED *** (0 milliseconds)
[info] None was not equal to Some("value1") (RowTest.scala:97)
答案 0 :(得分:2)
我不确定这里究竟是什么问题,所以我只讨论第二部分。 schema
is overridden中的GenericRowWithSchema
定义如下:
class GenericRowWithSchema(values: Array[Any], override val schema: StructType)
为了说明正在进行的操作,请考虑以下示例
trait Foobar {
def foo: Integer = null
}
class Foo(override val foo: Integer) extends Foobar
class Bar extends Foobar
new Foo(1).foo != null
// Boolean = true
new Bar().foo == null
// Boolean = true