在Spark中将BigInt转换为Int

问题描述 投票:3回答:3

嗨,我正在尝试投射BigIntto和intin命令生成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()

在Zeppelin中,fs计数提供以下异常:

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

scala apache-spark apache-spark-mllib apache-zeppelin
3个回答
3
投票

转换就像更改代码所用的“眼镜”来表示您的值引用的内容,而不是实际更改引用的内容,也不更改引用指向新的BigInt实例。

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

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

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

row.getAs[Long](0).toInt

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


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
© www.soinside.com 2019 - 2024. All rights reserved.