2017-01-19 8 views
2

Привет, я пытаюсь нарисовать BigInt на int, чтобы сгенерировать классы Rating. Я только хочу, чтобы использовать экземпляры, которые достаточно малы, чтобы вписаться в в Я использую следующий код:Кастинг BigInt to Int in Spark

val tup=rs.select("kunden_nr","product_list") 
val rdd=tup.rdd.map(row=>(row.getAs[BigInt](0),row.getAs[Seq[Int]](1))) 
val fs=rdd.filter(el=>el._1.isValidInt) 
fs.count() 
rdd.count() 

Количество фс Вынес следующее исключение в Zepplin:

java.lang.ClassCastException: java.lang.Long cannot be cast to scala.math.BigInt

ответ

3

Кастинг например, изменение «очков» вашего кода для представления того, на что ссылается ваше значение, а не на самом деле изменение ссылочного содержимого или изменение ссылки, чтобы указать на новый экземпляр BigInt.

Это означает, что вам нужно, чтобы получить значение с типом он действительно имеет, а затем построить BigInt экземпляр из него:

BigInt(row.getAs[Long](0)) 

Следуя той же логике, вы можете создать Int экземпляр из Long как следует:

row.getAs[Long](0).toInt 

Но он может переполнить целочисленный диапазон представления типа.

+0

Извините, но мне нужен Int. Итак, цепочка - BigInt => Int –

+0

@jojo_Berlin Не беспокойтесь, проверьте мое редактирование –

+0

Спасибо, что сделал трюк :) –

0

Я заметил, что переполнение происходит для меня довольно часто с .toInt , поэтому я попытался добавить остаток и частное.

((rec.getLong(0) % Int.MaxValue) + (rec.getLong(0)/Int.MaxValue)).toInt 

Это было лучше, так как я получал 232 уникальных значений в месте 234, но с toInt я получал 6 уникальных значений вместо 234.

0

Когда я использую ниже бросить, значение числа будет изменено!

table.col("id").cast("long") //java