Azure Apache Spark DataFrame调用groupby抛出NameError报错问题
报错原因排查
- 核心问题出在
sum()函数的参数写法:直接写TripDistanceMiles时,Python解释器会将其识别为未定义的Python变量,而非DataFrame的列名,因此直接抛出NameError。 - 额外注意第二段代码的存储路径存在拼写错误:容器名少写了末尾的
e,正确容器名是testcontainer4synapse,你写为了testcontainer4synaps,语法问题修复后这个错误会触发文件找不到异常,需要同步修正。
修复方案
Spark DataFrame聚合函数传列名有三种正确写法,任选其一即可:
写法1:列名用字符串包裹(最简单的写法)
%%pyspark # 修正容器名拼写错误 df = spark.read.load('abfss://testcontainer4synapse@adlsgen2synspsetest.dfs.core.windows.net/NYCTripSmall.parquet', format='parquet') df = df.select("PassengerCount","TripDistanceMiles").limit(100) # sum参数传字符串格式的列名 display(df.groupBy("PassengerCount").sum("TripDistanceMiles").limit(100))
写法2:通过df.colName的方式指定列
%%pyspark df = spark.read.load('abfss://testcontainer4synapse@adlsgen2synspsetest.dfs.core.windows.net/NYCTripSmall.parquet', format='parquet') df = df.select("PassengerCount","TripDistanceMiles").limit(100) display(df.groupBy("PassengerCount").sum(df.TripDistanceMiles).limit(100))
写法3:用col函数指定列(适合多列聚合、条件聚合等复杂场景)
%%pyspark from pyspark.sql.functions import col, sum df = spark.read.load('abfss://testcontainer4synapse@adlsgen2synspsetest.dfs.core.windows.net/NYCTripSmall.parquet', format='parquet') df = df.select("PassengerCount","TripDistanceMiles").limit(100) display(df.groupBy("PassengerCount").agg(sum(col("TripDistanceMiles"))).limit(100))
如果需要优化聚合后的列名可读性,可追加重命名操作,示例:
display(df.groupBy("PassengerCount").sum("TripDistanceMiles").withColumnRenamed("sum(TripDistanceMiles)", "TotalTripDistance").limit(100))
内容的提问来源于stack exchange,提问作者nam
相关产品推荐
相关产品推荐

