我想映射包含不同DataTypes的数组以自动创建StructField。但我对DecimalType有一些问题。例如,如果我测试
val myType1 = StringType
val testString = myType1.asInstanceOf[DataType]
我没问题。但是下面有一行
val myType2 = DecimalType
val testDecimal = myType2.asInstanceOf[DataType]
我得到了这个例外:
Exception in thread "main" java.lang.ClassCastException: org.apache.spark.sql.types.DecimalType$ cannot be cast to org.apache.spark.sql.types.DataType
我不明白,因为在文档中我认为DecimalType继承了DataType:
https://spark.apache.org/docs/2.0.2/api/java/org/apache/spark/sql/types/DecimalType.html
所以我正在寻找所有" spark.sql.type"的父对象。
我的目标是映射类似的东西:
Array(("name",StringType),("size", LongType),("att3",DecimalType),("age",IntegerType))
到StructField数组。
有没有人有任何想法?
答案 0 :(得分:1)
当您仅使用DecimalType
时,您会获得对DecimalType
的对象的引用,而不是确切的对象。
val a = DecimalType
a: org.apache.spark.sql.types.DecimalType.type = org.apache.spark.sql.types.DecimalType$@156bb545
而不是,
val a = DecimalType(10,0)
a: org.apache.spark.sql.types.DecimalType = DecimalType(10,0)
替代方案是使用:
myType2(10,0).asInstanceOf[DataType]
org.apache.spark.sql.types.DataType = DecimalType(10,0)
//or if you want max precision and scala
myType2.Unlimited.asInstanceOf[DataType]
org.apache.spark.sql.types.DataType = DecimalType(38,18)