Pyspark DataFrame下按UPC规则计算11位字符串校验位并生成新值
Pyspark实现UPC校验位生成方案
方案1:使用Pyspark内置函数实现(性能最优)
完全基于Pyspark原生函数实现,无需自定义UDF,计算效率更高,适合大数据量场景:
- 首先导入依赖
from pyspark.sql import functions as F
- 核心逻辑实现
# 你的原始DataFrame记为df df = df.withColumn( "odd_sum", sum(F.cast(F.substr(F.col("RESULT"), i, 1), "int") for i in [1,3,5,7,9,11]) ).withColumn( "even_sum", sum(F.cast(F.substr(F.col("RESULT"), i, 1), "int") for i in [2,4,6,8,10]) ).withColumn( "total", F.col("odd_sum") * 3 + F.col("even_sum") ).withColumn( "check_digit", F.when(F.col("total") % 10 == 0, 0).otherwise(10 - (F.col("total") % 10)) ).withColumn( "RESULT_FINAL", F.concat(F.col("RESULT"), F.col("check_digit").cast("string")) ) # 可按需删除中间计算列 df = df.drop("odd_sum", "even_sum", "total", "check_digit")
方案2:自定义UDF实现(灵活性更高)
如果后续校验规则调整,修改UDF逻辑即可,维护更方便:
- 定义UDF函数
from pyspark.sql.types import StringType def calc_upc_check_digit(upc_11): # 奇数位求和(位置从左到右1开始计数) odd_sum = sum(int(upc_11[i]) for i in range(0, 11, 2)) # 偶数位求和 even_sum = sum(int(upc_11[i]) for i in range(1, 10, 2)) total = odd_sum *3 + even_sum mod = total %10 check_digit = 0 if mod ==0 else 10 - mod return f"{upc_11}{check_digit}" calc_upc_udf = F.udf(calc_upc_check_digit, StringType())
- 调用UDF生成结果列
df = df.withColumn("RESULT_FINAL", calc_upc_udf(F.col("RESULT")))
测试验证
以示例值03600024145测试,两种方案生成的RESULT_FINAL均为036000241457,符合需求。
内容的提问来源于stack exchange,提问作者Deb
相关产品推荐
相关产品推荐

