PySpark报错Column Is Not Iterable:同交易ID标签比对问题求解
问题分析与解决
错误原因
你遇到的TypeError: Column is not iterable是因为F.substring函数的第三个参数(截取长度)在部分Spark版本中仅支持整数字面量,无法直接传入Column对象。你代码里用了F.col('m.length')作为长度参数,导致Spark无法解析,触发报错。
解决方案
可以通过Spark SQL表达式来实现动态长度的字符串截取,用F.expr函数直接编写SQL风格的逻辑,这样就能支持用列值作为截取长度。
修正后的代码如下:
df = (df.filter("module_name = 'mcc'").alias('m') .join(df.filter("module_name = 'regex'").alias('r'), 'transaction_id') .withColumn('check', F.expr("m.transaction_label = substring(r.transaction_label, 1, m.length)")) ) df.show()
验证结果
运行上述代码后,会生成check列,标记同一transaction_id下,mcc模块的transaction_label是否与regex模块标签的前m.length个字符一致。针对你的数据,比如transaction_id=0P2117294027213,会检查FUN04是否等于FUN0402007的前5个字符,结果为true。
如果你的Spark版本在3.0及以上,也可以直接使用F.substr函数(该版本开始支持传入Column作为长度参数),代码如下:
df = (df.filter("module_name = 'mcc'").alias('m') .join(df.filter("module_name = 'regex'").alias('r'), 'transaction_id') .withColumn('check', F.col('m.transaction_label') == F.substr('r.transaction_label', 1, F.col('m.length'))) ) df.show()
内容的提问来源于stack exchange,提问作者Stanislav Jirak
相关产品推荐
相关产品推荐

