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

Scala Spark无法在类型溢出期间以更高的精度推断类型,scala,apache-spark,Scala,Apache Spark,我在尝试这样的事情 val df = Seq((50984908,1000)).toDF("x","y") val myExpression = "x * y" df.withColumn("z",expr(myExpression)).show() 我可以看到它导致整数溢出,而不是转换为Long +--------+----+----------+ | x| y| z| +----

我在尝试这样的事情

val df = Seq((50984908,1000)).toDF("x","y")
val myExpression = "x * y"
df.withColumn("z",expr(myExpression)).show()
我可以看到它导致整数溢出,而不是转换为Long

+--------+----+----------+
|       x|   y|         z|
+--------+----+----------+
|50984908|1000|-554699552|
+--------+----+----------+
是否有人可以提供建议,如何避免这些溢出?
是否有一种方法可以让Spark自动正确地推断类型的更高精度(例如:Integer->Long),(Float->Double/BigDecimal)?

在Scala中,您可以通过添加
L
后缀显式声明数字文字长度。如果您这样做,类型将正确推断为
Long

val df = Seq((50984908L,1000L)).toDF("x","y")
val myExpression = "x * y"
df.withColumn("z",expr(myExpression)).show()
如果需要对列类型进行更多控制,还可以使用函数
createDataFrame

import org.apache.spark.sql.types._
import org.apache.spark.sql.Row

val someData = Seq(
  Row(50984908L, 1000L)
)

val myExpression = "x * y"

val someSchema = List(
  StructField("x", LongType, true),
  StructField("y", LongType, true)
)

val df = spark.createDataFrame(
  spark.sparkContext.parallelize(someData),
  StructType(someSchema)
)

df.withColumn("z",expr(myExpression)).show()

在Scala中,可以通过添加
L
后缀显式声明数字文字长度。如果您这样做,类型将正确推断为
Long

val df = Seq((50984908L,1000L)).toDF("x","y")
val myExpression = "x * y"
df.withColumn("z",expr(myExpression)).show()
如果需要对列类型进行更多控制,还可以使用函数
createDataFrame

import org.apache.spark.sql.types._
import org.apache.spark.sql.Row

val someData = Seq(
  Row(50984908L, 1000L)
)

val myExpression = "x * y"

val someSchema = List(
  StructField("x", LongType, true),
  StructField("y", LongType, true)
)

val df = spark.createDataFrame(
  spark.sparkContext.parallelize(someData),
  StructType(someSchema)
)

df.withColumn("z",expr(myExpression)).show()

您好,谢谢您的回复。如果我们读取csv文件并将其存储在数据框中,是否有一种方法可以控制类型`session.read.format(“csv”).option(“header”,“true”).option(“quote”,dqualifier)。option(“ignoreTrailingWhiteSpace”,value=true)。option(“multiLine”,value=true)。option(“inferSchema”,value=infer)。load(fileLocation)```我知道inferSchema会推断模式类型,但是,我们是否可以将其替换为更健壮的内容,以便我们能够正确地为列分配列类型?如果它不能回答您的问题,请创建另一个问题。如果您认为该问题回答了您的问题,您也可以向上投票/接受该问题。您好,谢谢您的回答。如果我们读取csv文件并将其存储在数据框中,是否有一种方法可以控制类型`session.read.format(“csv”).option(“header”,“true”).option(“quote”,dqualifier)。option(“ignoreTrailingWhiteSpace”,value=true)。option(“multiLine”,value=true)。option(“inferSchema”,value=infer)。load(fileLocation)```我知道inferSchema会推断模式类型,但是,我们是否可以将其替换为更健壮的内容,以便我们可以正确地为列分配列类型?如果它不能回答您的问题,请创建另一个问题。如果您觉得这个问题没有回答您的问题,您也可以向上投票/接受它。