#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, вы можете попробовать этот вариант.