带有架构的行为row.schema

时间:2015-11-29 02:27:56

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

我知道你会期待代码,但代码看起来很好,我无法理解会出现什么问题。我会解释这个问题,让我们看看你是否可以告诉我,我是否遗漏了一些明显的东西。

我为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)

1 个答案:

答案 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