Как использовать методы объектов в каждой строке фрейма искры в scala [duplicate]

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

26
задан zero323 8 October 2015 в 11:36
поделиться

4 ответа

Давайте начнем с некоторых фиктивных данных:

val transactions = Seq((1, 2), (1, 4), (2, 3)).toDF("user_id", "category_id")

val transactions_with_counts = transactions
  .groupBy($"user_id", $"category_id")
  .count

transactions_with_counts.printSchema

// root
// |-- user_id: integer (nullable = false)
// |-- category_id: integer (nullable = false)
// |-- count: long (nullable = false)

Существует несколько способов получить доступ к значениям Row и сохранить ожидаемые типы:

  1. Учет соответствия
    import org.apache.spark.sql.Row
    
    transactions_with_counts.map{
      case Row(user_id: Int, category_id: Int, rating: Long) =>
        Rating(user_id, category_id, rating)
    } 
    
  2. Настроены методы get*, такие как getInt, getLong:
    transactions_with_counts.map(
      r => Rating(r.getInt(0), r.getInt(1), r.getLong(2))
    )
    
  3. getAs метод, который может использовать как имена, так и индексы:
    transactions_with_counts.map(r => Rating(
      r.getAs[Int]("user_id"), r.getAs[Int]("category_id"), r.getAs[Long](2)
    ))
    
    Это может быть используется для правильного извлечения определенных пользователем типов, включая mllib.linalg.Vector. Очевидно, что для доступа по имени требуется схема.
  4. Преобразование в статически типизированное Dataset (Spark 1.6+ / 2.0+):
    transactions_with_counts.as[(Int, Int, Long)]
    
45
ответ дан zero323 18 August 2018 в 19:50
поделиться
  • 1
    Какой из них наиболее эффективный выход из четырех подходов, о которых вы упоминали ...? – Dilan 11 August 2017 в 11:15
  • 2
    @Dilan Шаблон соответствия статически типизированных параметров может быть медленнее (последний имеет некоторые другие последствия). getAs[_] и get* должны быть похожими, но больны в использовании. – zero323 11 August 2017 в 11:33
  • 3
    1. Что это означает: «последний имеет некоторые другие последствия для производительности» ...? 2. Имеет ли getAs [_] и получается * лучше, чем соответствие шаблону с точки зрения производительности? – Dilan 12 August 2017 в 07:00
  • 4
    Я использую 1-й метод, описанный выше для DataFrame, имеющий нулевых столбцов , подобных этому case Row(usrId: Int, usrName: String, null, usrMobile: Int) => ... и case Row(usrId: Int, usrName: String, usrAge: Int, null) => ..., что приводит к длинным case-выражениям (и у меня есть несколько случаев). Есть ли более чистый способ (более сжатый, менее шаблонный / повторяющийся материал), чтобы сделать это? Пожалуйста, ответьте на пример. – y2k-shubham 22 January 2018 в 08:53

Используя Datasets, вы можете определить рейтинги следующим образом:

case class Rating(user_id: Int, category_id:Int, count:Long)

Класс Rating здесь имеет имя столбца «count» вместо «rating», как предлагалось в качестве нулевого323. Таким образом, рейтинговая переменная присваивается следующим образом:

val transactions_with_counts = transactions.groupBy($"user_id", $"category_id").count

val rating = transactions_with_counts.as[Rating]

Таким образом, вы не будете запускать ошибки времени выполнения в Spark, потому что имя столбца вашего рейтинга совпадает с именем столбца «count», сгенерированным Spark во время выполнения.

6
ответ дан user-asterix 18 August 2018 в 19:50
поделиться
0
ответ дан Sarath Avanavu 7 September 2018 в 04:01
поделиться
0
ответ дан Sarath Avanavu 30 October 2018 в 08:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: