PySpark使用groupBy传入列列表报错,无法获取全部列求助
搞定PySpark groupBy的这个报错,顺便解决列选择问题
为啥会报错?
兄弟,你碰到的这个Py4JError根源很明确:Spark的groupBy方法不接受直接传入列表作为分组列参数!当你写groupBy("TCID", columnList)的时候,Spark会把整个columnList当成一个单独的列名去处理,而不是把列表里的每个元素都当作独立的分组列,这就导致它调用col()方法时找不到对应处理列表的重载,直接抛出了错误。
改完就能跑的代码
解决起来很简单,用Python的**解包操作符***把列表拆成一个个单独的参数传给groupBy就行。你原来筛选string类型列的逻辑是对的,只要加个*:
from pyspark.sql.functions import mean # 筛选所有string类型的列,这个逻辑没问题 columnList = [item[0] for item in df1.dtypes if item[1].startswith('string')] # 用*把列表拆成独立参数,Spark就能正确识别每个分组列了 df2 = df1.groupBy("TCID", *columnList).agg(mean("Runtime").alias("Runtime"))
额外提一嘴:如果要拿全部列分组
要是你本来的需求是除了Runtime之外的所有列都参与分组,而不是只挑选string类型的列,那可以直接这么写,更省事:
# 排除Runtime列,剩下的全拿来分组 all_cols_except_runtime = [col for col in df1.columns if col != "Runtime"] df2 = df1.groupBy(*all_cols_except_runtime).agg(mean("Runtime").alias("Runtime"))
这样就不用手动筛选列类型,直接按需求选列就行。
内容的提问来源于stack exchange,提问作者Praveen Mandadi
相关产品推荐
相关产品推荐

