PySpark中无法移除括号:处理含(Imps)的Decimal类型数据
问题:移除字符串中的括号内容并转换为decimal类型
我有格式为7,432,818 (Imps)的数据,需要加载到decimal(20,3)类型的列中。尝试用regexp_replace移除(Imps),但括号未被移除,使用的代码如下:
validated_df=validated_df.withColumn('MeasurePer', F.regexp_replace('MeasurePer', ',', '')) validated_df=validated_df.withColumn('MeasurePer', F.regexp_replace('MeasurePer', '(Imps)', ''))
得到的结果为:7432818 ()
解决方案
括号()在正则表达式中属于特殊元字符(用于定义捕获组),直接写(Imps)会被解析成捕获Imps这个字符串,而不会匹配实际的括号。需要对括号进行转义,或者使用原始字符串来避免转义问题。
方法1:转义括号
# 分两步替换:先去逗号,再移除(Imps) validated_df = validated_df.withColumn('MeasurePer', F.regexp_replace('MeasurePer', ',', '')) validated_df = validated_df.withColumn('MeasurePer', F.regexp_replace('MeasurePer', '\\(Imps\\)', ''))
方法2:合并替换(更高效)
可以用正则的或条件|一步完成逗号和(Imps)的移除:
validated_df = validated_df.withColumn( 'MeasurePer', F.regexp_replace('MeasurePer', r',|\(Imps\)', '') )
最终转换为decimal类型
处理完字符串后,需要将其转换为目标类型:
validated_df = validated_df.withColumn( 'MeasurePer', F.regexp_replace('MeasurePer', r',|\(Imps\)', '').cast('decimal(20,3)') )
内容的提问来源于stack exchange,提问作者user19814628
相关产品推荐
相关产品推荐

