如何在Spark SQL中实现集合操作而无需使用UDF
Spark SQL无UDF实现数组差集大小计算
完全可以通过内置函数实现需求,不需要自定义UDF。
Spark 2.4及以上版本没有单独的集合数据类型,集合交并差能力都封装在数组操作函数中:array_except函数原生支持计算两个数组的差集,逻辑等价于set(x) - set(y),返回的结果会自动对元素去重,再配合size函数就能直接拿到差集的元素个数。
实现方式1:DataFrame API替换原有UDF
替换你原有的UDF定义和调用逻辑即可:
from pyspark.sql.functions import array_except, size df = spark.sql(""" ... 你原来生成todays_ids、previous_days_ids列的查询逻辑 """) # 直接用内置函数计算差集大小,完全等价于你写的UDF逻辑 df = df.withColumn('difference', size(array_except('todays_ids', 'previous_days_ids'))) df.createOrReplaceTempView("differences")
实现方式2:纯Spark SQL一步计算
不需要转换DataFrame处理,直接在SQL语句中完成所有逻辑:
SELECT *, size(array_except(todays_ids, previous_days_ids)) AS difference FROM ( -- 你原来生成todays_ids、previous_days_ids列的子查询 SELECT ... ) AS origin_data
注意:如果你的ID数组中存在NULL值,
array_except会将两个数组中的NULL视为相等值,如需过滤NULL可以先通过array_remove函数清理数组中的NULL元素再计算差集。
内置函数对比Python UDF有显著性能优势:原生实现规避了跨进程通信、序列化反序列化开销,大数据量下执行效率可以提升数倍。
内容的提问来源于stack exchange,提问作者Yu Chen
相关产品推荐
相关产品推荐

