PySpark使用when、endsWith与regexp_replace时报'Column' object not callable
报错原因
- 变量名传错:你定义的源数据列表变量名为
address,但spark.createDataFrame的第一个参数写的是不存在的name变量。 - 依赖函数未导入:代码只导入了
regexp_extract,但实际用到的regexp_replace函数没有提前导入,这是触发'Column' object is not callable报错的核心原因。 - 额外说明:PySpark Python API不支持
$"address"这种Scala风格的列引用写法,用col("address")或df.address都是正确的,你之前的列引用写法没有问题。
修正后可运行代码
from pyspark.sql import SparkSession from pyspark.sql.functions import when, col, regexp_replace # 若你的环境已预定义spark变量,可省略初始化步骤 spark = SparkSession.builder.appName("address_replace").getOrCreate() address = [(1,"14851 Jeffrey Rd","DE"),(2,"43421 Margarita St","NY"),(3,"13111 Siemon Ave","CA"),(4,"110 South Ave","FL")] # 修正第一个参数为正确的变量名address df = spark.createDataFrame(address, ["id","address","state"]) df.withColumn("address", # 正则加$符号匹配末尾缩写,避免地址中间出现缩写时误替换 when(col("address").endsWith("Rd"), regexp_replace(col("address"), r"Rd$", "Road")) .when(col("address").endsWith("St"), regexp_replace(col("address"), r"St$", "Street")) .when(col("address").endsWith("Ave"), regexp_replace(col("address"), r"Ave$", "Avenue")) .otherwise(col("address")) # 传列对象而非字符串,避免未匹配的地址被覆盖为固定字符串 ).show(truncate=False)
运行输出
+---+----------------------+-----+ |id |address |state| +---+----------------------+-----+ |1 |14851 Jeffrey Road |DE | |2 |43421 Margarita Street|NY | |3 |13111 Siemon Avenue |CA | |4 |110 South Avenue |FL | +---+----------------------+-----+
内容的提问来源于stack exchange,提问作者user4516038
相关产品推荐
相关产品推荐

