2016-07-07 1 views
0

Я пытаюсь сделать простой MR работу Спарк, вот коды:Что делать, если результат reduceByKey (_ + _) превышайте INT Диапазон

val testRDD = someRDD.map((_, 1)).reduceByKey(_+_) 

На этапе карте, значение Int , что, если на стадии уменьшения значение слишком велико, что превышает диапазон Int? Вероятно, я могу сделать это

val testRDD = someRDD.map((_, 1.toLong)).reduceByKey(_+_) 

Но есть ли идея лучше?

ответ

2

Ничего особенного. Это просто приведет к integer overflow:

sc.parallelize(Seq(("a", Integer.MAX_VALUE), ("a", 1))).reduceByKey(_ + _).first 

// (String, Int) = (a,-2147483648) 

Если вы подозреваете, что ошибки переполнения может произойти, вы должны обязательно использовать более подходящий тип данных и Long является хорошим выбором для целочисленных значений:

sc.parallelize(Seq(
    ("a", Integer.MAX_VALUE.toLong), ("a", 1L) 
)).reduceByKey(_ + _).first 

// (String, Long) = (a,2147483648) 
Смежные вопросы