Arhn - архитектура программирования

Вывод схемы класса case рассматривает как поля опций, так и поля без опций как допускающие значение NULL.

Я выполнил следующее упражнение с искровой оболочкой:

Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.1.0
      /_/

Using Scala version 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_121)
Type in expressions to have them evaluated.
Type :help for more information.

scala> case class Test(notNullable:String, nullable:Option[String])
defined class Test

scala> val myArray = Array(
     | Test("x", None),
     | Test("y", Some("z"))
     | )
myArray: Array[Test] = Array(Test(x,None), Test(y,Some(z)))

scala> val rdd = sc.parallelize(myArray)
rdd: org.apache.spark.rdd.RDD[Test] = ParallelCollectionRDD[0] at parallelize at <console>:28

scala> rdd.toDF.printSchema
root
 |-- notNullable: string (nullable = true)
 |-- nullable: string (nullable = true)

Я читал (Spark в действии), что для класса case с полями Option те, которые не являются необязательными, должны рассматриваться как не допускающие значение NULL. Это правда? Если да, то что я здесь делаю неправильно?


Ответы:


1

Здесь есть две проблемы:

  1. Необязательные поля считаются необнуляемыми только для некоторых типов (Int, Long, Short, Double, Float, Byte, Boolean), и String, по-видимому, не является одним из них; Вы можете увидеть поведение для Int, например:

    case class Test(notNullable: String,
                nullable: Option[String],
                notNullInt: Int,
                nullableInt: Option[Int])
    
    val myArray = Array(
      Test("x", None, 1, None),
      Test("y", Some("z"), 2, Some(3))
    )
    
    myArray.toSeq.toDF().printSchema
    // root
    //  |-- notNullable: string (nullable = true)
    //  |-- nullable: string (nullable = true)
    //  |-- notNullInt: integer (nullable = false) // !!!
    //  |-- nullableInt: integer (nullable = true)
    

    это можно увидеть, просмотрев код в org.apache.spark.sql.catalyst.ScalaReflection.schemaFor:

    def schemaFor(tpe: `Type`): Schema = ScalaReflectionLock.synchronized {
      tpe match {
        // ...
        case t if t <:< localTypeOf[String] => Schema(StringType, nullable = true)
        // ...
        case t if t <:< definitions.IntTpe => Schema(IntegerType, nullable = false)
        case t if t <:< definitions.LongTpe => Schema(LongType, nullable = false)
        case t if t <:< definitions.DoubleTpe => Schema(DoubleType, nullable = false)
        case t if t <:< definitions.FloatTpe => Schema(FloatType, nullable = false)
        case t if t <:< definitions.ShortTpe => Schema(ShortType, nullable = false)
        case t if t <:< definitions.ByteTpe => Schema(ByteType, nullable = false)
        case t if t <:< definitions.BooleanTpe => Schema(BooleanType, nullable = false)
        // ...
      }
    }
    
  2. По-видимому, существует другой путь кода для вывода схемы, если вы сначала создаете RDD, а затем затем конвертируете его в DF, вместо того, чтобы преобразовывать локальную коллекцию непосредственно в DF — оба ведут себя иначе:

    case class Test(notNullInt: Int, nullableInt: Option[Int])
    
    val myArray = Array(
      Test(1, None),
      Test(2, Some(3))
    )
    
    sc.parallelize(myArray).toDF.printSchema
    // root
    // |-- notNullInt: integer (nullable = true) // NULLABLE TOO!
    // |-- nullableInt: integer (nullable = true)
    
    myArray.toSeq.toDF().printSchema
    // root
    // |-- notNullInt: integer (nullable = false)
    // |-- nullableInt: integer (nullable = true)
    
01.08.2017
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..