Как решить, использовать ли фильтр Spark RDD или нет

#apache-spark

#apache-spark

Вопрос:

Я использую spark для чтения и анализа файла данных, файл содержит следующие данные:

  • 1, единица измерения 1,категория1_1,100
  • 2, единица измерения 1,категория1_2,150
  • 3, unit2,category2_1,200
  • 4, unit3,category3_1,200
  • 5, unit3,category3_2,300

Файл содержит около 20 миллионов записей. Если пользователь вводит единицу или категорию, spark необходимо отфильтровать данные по inputUnit или inputCategory.

Решение 1:

 sc.textFile(file).map(line => {
  val Array(id,unit,category,amount) = line.split(",")
  if ( (StringUtils.isNotBlank(inputUnit) amp;amp; unit != inputUnit ) ||
    (StringUtils.isNotBlank(inputCategory) amp;amp; category != inputCategory)){
    null
  } else {
    val obj = new MyObj(id,unit,category,amount)
    (id,obj)
  }
}).filter(_!=null).collectAsMap()
  

Решение 2:

 var rdd = sc.textFile(file).map(line => {
  val (id,unit,category,amount) = line.split(",")
  (id,unit,category,amount)
})

if (StringUtils.isNotBlank(inputUnit)) {
  rdd = rdd.filter(_._2 == inputUnit)
}
if (StringUtils.isNotBlank(inputCategory)) {
  rdd = rdd.filter(_._3 == inputCategory)
}

rdd.map(e => {
  val obj = new MyObject(e._1, e._2, e._3, e._4)
  (e._1, obj)
}).collectAsMap
  

Я хочу понять, какое решение лучше, или оба они плохие? Если оба плохие, как сделать хороший? Лично я думаю, что второй вариант лучше, но я не совсем уверен, хорошо ли объявлять rdd как var… (Я новичок в Spark, и я использую Spark 1.5.0 и Scala 2.10.4 для написания кода, я впервые задаю вопрос в StackOverflow, не стесняйтесь редактировать, если он плохо отформатирован) Спасибо.

Комментарии:

1. Если вы имеете дело с огромными записями, я бы рекомендовал использовать фреймы данных в spark, а не в RDD, поскольку фреймы данных динамически создают бесконечные наборы данных. Этого можно достичь с помощью spark2.0 . Также вам необходимо использовать spark Sql для регистрации в любом jdbc для отображения данных в dataframes.

2. Привет, Правин, на данный момент я не могу обновить spark до версии 2.0, это существующий проект, я просто пытаюсь добавить больше функций…

3. Фреймы данных доступны с версии spark 1.3, вы можете попробовать этот вариант.