需求背景:对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方法没有受到数据类型的影响,有可能是函数内部做了数据类型的适配,有知道的小伙伴可以评论告诉我学习一下,多谢了~