spark无法在类型溢出期间以更高的精度推断类型

mm5n2pyu  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(520)

我正试着这样做

  1. val df = Seq((50984908,1000)).toDF("x","y")
  2. val myExpression = "x * y"
  3. df.withColumn("z",expr(myExpression)).show()

我可以看到它导致整数溢出,它不会被转换为long

  1. +--------+----+----------+
  2. | x| y| z|
  3. +--------+----+----------+
  4. |50984908|1000|-554699552|
  5. +--------+----+----------+

有没有人能提供一些建议来避免这些溢出?有没有一种方法可以让spark自动正确地推断出类型的更高精度(例如:integer->long),(float->double/bigdecimal)?

8gsdolmq

8gsdolmq1#

在scala中,可以通过添加 L 后缀。如果这样做,类型将正确推断为 Long :

  1. val df = Seq((50984908L,1000L)).toDF("x","y")
  2. val myExpression = "x * y"
  3. df.withColumn("z",expr(myExpression)).show()

如果需要对列类型进行更多控制,也可以使用函数 createDataFrame :

  1. import org.apache.spark.sql.types._
  2. import org.apache.spark.sql.Row
  3. val someData = Seq(
  4. Row(50984908L, 1000L)
  5. )
  6. val myExpression = "x * y"
  7. val someSchema = List(
  8. StructField("x", LongType, true),
  9. StructField("y", LongType, true)
  10. )
  11. val df = spark.createDataFrame(
  12. spark.sparkContext.parallelize(someData),
  13. StructType(someSchema)
  14. )
  15. df.withColumn("z",expr(myExpression)).show()
展开查看全部

相关问题