在Spark中将BigInt转换为Int

时间:2017-01-19 08:01:14

标签: scala apache-spark apache-spark-mllib apache-zeppelin

您好我正在尝试将BigInt投射到int以生成Rating课程。 我只想使用足够小的实例来使用以下代码:

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()

fs count在Zepplin中提供以下异常:

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

3 个答案:

答案 0 :(得分:3)

铸造就像改变眼镜"您的代码用于表示您的值引用的内容,而不是实际更改引用的内容,也不会将引用更改为指向新的BigInt实例。

这意味着你需要使用它真正具有的类型来获取你的值,然后从中构建一个BigInt实例:

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

遵循相同的推理,您可以从Int创建Long个实例,如下所示:

row.getAs[Long](0).toInt

但它可能溢出整数类型表示范围。

答案 1 :(得分:0)

我注意到.toInt经常发生溢出事件 所以我尝试添加余数和商。

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

这更好,因为我获得了232个独特的值代替234但是有了toInt我获得了6个独特的值而不是234个。

答案 2 :(得分:0)

当我使用以下内容进行投射时,数字的值将会改变!

{{1}}