数据类型背锅记-filter与where条件

需求背景:对hive表中的某一列进行函数处理转化成分数,然后根据分数阈值进行数据筛选

自定义函数如下,实现功能就是提取字段里的概率值:

def get_chain_score(P):
    p = str(p).split(',')[0].strip('[')
    if 'E' in p:
        return 0
    else:
        return float(p)
sqlContext.registerFunction('get_chain_score', get_chain_score)

SQL语句

sql = "select risk_type,value,black_value,get_chain_score(probability) as chain_score from riskchain_final_id2mob"

df = spark.sql(sql)

现在我想要筛选出chain_score大于等于0.5的数据

方法1

df.filter(df.chain_score>=0.5).count()

方法2

df.registerTempTable('test')
spark.sql('select * from test where chain_score < 0.5').count()

方法1结果:4544528

方法2结果:1358046    怎么数据量少这么多???

debug了好久,还是百思不得其解,不加限制条件两边的总量是一致的,chain_score也没有null值,两个方法的效果应该是等效的,突然灵光一现,会不会是数据类型惹的祸呢,类似的坑好像踩过几次

好吧,那我们来看下df的结构

df.printSchema()

结果如下:

我们可以看到,chain_score是string,虽然我的UDF里返回值是0或者float类型,但是好像函数处理后的结果还是string,那看来只能强制类型转化一下试试

sql = "select risk_type,value,black_value,cast(get_chain_score(probability) as float) as chain_score from riskchain_final_id2mob"

重新跑了后两边的结果是一致的!

filter方法没有受到数据类型的影响,有可能是函数内部做了数据类型的适配,有知道的小伙伴可以评论告诉我学习一下,多谢了~


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值