You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 01:54:01