2015-11-29 4 views
0

Я знаю, что вы ожидали бы кода для этого, но код выглядит хорошо, и я не могу понять, что происходит не так. Я бы объяснил проблему и посмотрим, можете ли вы сказать мне, не хватает ли я чего-то очевидного.Строка со схемой возвращает null для row.schema

Я написал неявный класс для , функция, в которой используется row.schema для получения схемы. Что смешно, хотя row.schema всегда возвращает null в неявном классе, имеет ли объект строки схему или нет, тогда как то же самое возвращает фактическую схему в классе, содержащем модульный тест (я использую FlatSpec with Matchers для модульного тестирования). Так строятся строки в модульном тесте.

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) в this code на и соответствующие тесты here.

Вот как те, которые терпят неудачу, терпят неудачу,

[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

[A Minimal, полный и Проверяемость пример] (http://stackoverflow.com/ help/mcve). Трудно понять, в чем проблема, не говоря уже о воспроизведении. – zero323

+0

@ zero323 Добавлен код. – aa8y

ответ

2

Я не совсем уверен, что именно здесь проблема, поэтому я буду обращаться только вторую часть. schema определение в GenericRowWithSchemais overridden следующим образом:

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 
+0

Код был добавлен. Надеюсь, это прояснит это больше. – aa8y

Смежные вопросы