Spark: Unit Test - у меня есть одна функция, которая объединяет 3 набора входных данных.Должен ли я сделать юнит-тест на них? - PullRequest
0 голосов
/ 23 сентября 2019

Я написал код, часть которого, как показано ниже

Object Cal{
def mergedatasets(df: Dataset[Row], df1: Dataset[Row],df2: Dataset[Row]):Dataset[Row]={
 df.union(df1).union(df2)
//other logic

}

}
object readDataframes{
def readFirstDF(spark:SparkSession):Dataset[Row]={
 spark.read.json(somefile)
}
def readSecondDF(spark:SparkSession):Dataset[Row]={
 spark.read.json(somefile)
}
def readThirdDF(spark:SparkSession):Dataset[Row]={
 spark.read.json(somefile)
}
}

В приведенном выше коде я читаю 3 файла и затем объединяю их в один, который я использую для дальнейшей обработки.Исходя из описанного выше сценария, мои вопросы таковы:

  1. Имеет ли смысл юнит-тестирование функции mergdatasets?Если да, Какие основные / минимальные вещи нужно проверить? Как проверить угловые случаи, если таковые имеются?
  2. Имеет ли смысл провести модульное тестирование readDataframes? Если да, то для чего нужно проверять?проверить, соответствует ли предполагаемая схема ожидаемой?и еще что-нибудь?

Я хотел бы также расширить вышеупомянутые вопросы для следующих функций

def timeIntervalAgg(df: Dataset[Row]): Dataset[Row] = {

    val timeInterval = df
      .groupBy("id","page_number")
      .agg(sum("timeInterval").alias("timeInterval"))
    timeIntervalAgg

  }

  def timeInterval(df: Dataset[Row]): Dataset[Row] ={

    val windowSpec = Window.partitionBy("id").orderBy("date_time")
    val timeFmt = "yyyy-MM-dd'T'HH:mm:ss"
    val endTime = lead(col("date_time"),1).over(windowSpec)
    val startTime = col("date_time")
    val timeDiff = (unix_timestamp(endTime, timeFmt)
      - unix_timestamp(startTime, timeFmt))
    val timeInterval = df
      .withColumn("timeInterval", lit(when(col("event") === "this_event",lit(null)
        .cast("long"))
        .otherwise(timeDiff)))
      .where("""event != "this_event" """)
    timeInterval

  }

  def addOddpages(df: Dataset[Row]) :Dataset[Row] = {

    val odd = df
      .where("""view_mode = "twin" """)
      .withColumn("page_odd", col("page") + 1)
      .drop("page")
      .select(col("id"), col("date_time")
        .cast("timestamp"),col("page_odd")
        .alias("page"), col("page_view_mode"),
        col("event"),col("timeInterval"))
    val timeIntervalWithoddPage = df.union(odd)
    timeIntervalWithoddPage

  }
  • Пожалуйста, предложите, если это необходимо для рефакторингалучший способ для лучшего тестирования.

  • Моя цель - понять, для чего тестировать?на что обратить внимание при написании теста для кода, как указано выше?Все эти вопросы относятся к тестированию Spark-кода, а не к тестированию кода на других языках.

  • Как выполнить модульное тестирование без избыточного тестирования искры, которая уже проверена?
  • Нужно ли тестировать каждую функцию?как это (так как логика / код не очень сложный) или лучше всего протестировать функцию, которая объединяет вышеупомянутые функции в правильном порядке. При этом это можно назвать модульным тестированием?
  • Пожалуйста, не стесняйтесь поделитьсянекоторые примеры модульных тестов, которые вы можете написать для приведенного выше кода.

1 Ответ

0 голосов
/ 25 сентября 2019

Чтение файлов JSON. Если вы просто читаете файлы JSON, вам не нужно это проверять.Кроме того, может быть лучше прочитать файлы с явной схемой в schema(), чтобы избежать некоторых проблем с предполагаемой схемой.Кроме того, вам не нужно 3 идентичных метода для чтения файлов.

Наборы данных объединения: Начиная с Spark 2.3.0, есть функция unionByName().Эта функция разрешает столбцы по имени (не по позиции).Вы можете рассмотреть функции, чтобы избежать проблем с объединением, когда ваши DataFrames имеют другой порядок столбцов.Конечно, эту функцию не нужно тестировать.Трудно сказать о коде //other logic внутри метода mergedatasets().

Для модульного тестирования вы можете использовать ScalaTest или другие инструменты.

  • Создать SparkSession с master("local");
  • Создание DataFrame с ожидаемыми данными;
  • Создание входного DataFrame для каждого метода, который вы хотите проверить.;
  • Сравнение ожидаемого и фактического DataFrames;

Следующий проект может быть полезен.Вы можете найти там, как сравнить два DataFrames.Также в README есть несколько примеров: https://github.com/MrPowers/spark-fast-tests

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...