使用DecimalType将属性名称和DataType数组转换为Spark中的StructField数组时出现问题

时间:2017-07-17 10:00:58

标签: scala apache-spark

我想映射包含不同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数组。

有没有人有任何想法?

1 个答案:

答案 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)