spark-代码-修改df中的列的类型

一、需求

使用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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值