一、需求
使用spark解析pmml时,pmml中的类型要和hive表的类型严格对应(比如pmml的integer对应hive的int,不能是double)。
但hive中有decimal类型,而pmml一般使用python生成的,原生python没有decimal,需要导入依赖包,但导入依赖包后 AI组反映 没法生成pmml ==》
pmml中没法用decimal,所以只能在spark中把decimal转成double,因为不涉及商业计算,仅仅是预测,所以double可以用。
二、usage
目前找到的方法:使用dtypes获取列的name和类型的数组,注意这里的类型是string,也就是仅仅是类型的名字。
然后使用withColumn + col(colName).cast方法转类型
暂时还没找到直接获取df的列的类型然后直接判断 + 转的方法,应该是有的???
hive中的decimal类型,df的row在取值的时候,必须要用getDecimal方法来取,返回的是java的BigDecimal类型,这说明df中的列是带类型的,但获取类型的方法暂时没找到。
须知:
1. dtypes方法可以返回Array(String,String),元素是(列名,列的类型名)
2. col方法可以获取当前df的列的对象
注意必须引入隐式转换import org.apache.spark.sql.functions._
3. withColumn(args0,args1)可以将args1列覆盖args0,如果args0已存在就是更新,如果不存在就是新增
var dfDouble:DataFrame = df
val colTypes: Array[(String,String)] = dfDouble.dtypes
import org.apache.spark.sql.functions._
for((name.type_) <- colTypes){
if(type_.startsWith("DecimalType")){
dfDouble = dfDouble.withColumn(name,col(name).cast(DataTypes.DoubleType))
}
}
df = dfDouble