Как показано ниже,создания Искры карты занимает очень много времени
Шаг 1: Группа звонков с использованием GroupBy
//Now group the calls by the s_msisdn for call type 1
//grouped: org.apache.spark.rdd.RDD[(String, Iterable[(String, (Array[String], String))])]
val groupedCallsToProcess = callsToProcess.groupBy(_._1)
Шаг 2: сгруппированные вызовы отображаются.
//create a Map of the second element in the RDD, which is the callObject
//grouped: org.apache.spark.rdd.RDD[(String, Iterable[(String,(Array[String], String))])]
val mapOfCalls = groupedCallsToProcess.map(f => f._2.toList)
Шаг 3: Карта объекта Row, где карта будет иметь ключ-значение пары [CallsObject, MSISDN]
val listOfMappedCalls = mapOfCalls.map(f => f.map(_._2).map(c =>
Row(
c._1(CallCols.call_date_hour),
c._1(CallCols.sw_id),
c._1(CallCols.s_imsi),
f.map(_._1).take(1).mkString
)
))
3-й стадии, как показано выше, кажется, берет очень долго когда размер данных очень велик. Мне интересно, есть ли способ сделать шаг 3 эффективным. Полюбите любую помощь в этом.
Можете ли вы показать свой ввод и ожидаемый выход? Трудно следить за тем, что вы группируете и сопоставляете над –
Зачем вам нужно делать «Массив» на карте «Список»? Операция 'toList' не только очень дорогостоящая для больших коллекций, но и приводит к большому объему GC-overhead. –
Итак, нужно сделать шаг 2: val mapOfCalls = groupedCallsToProcess.map (f => f._2)? – sparkDabbler