如何修复PySpark中'function' object has no attribute 'rand'错误?
解决PySpark在Databricks中随机选取行的导入问题
别担心,作为PySpark新手遇到这类函数导入问题很正常,我来一步步帮你解决:
正确的两种实现方式
你要随机选取100行的思路是对的,问题出在rand函数的导入方式上,以下两种方法都能正常工作:
方式一:直接导入rand函数
这种方式适合只用到rand这一个函数的场景:
# 正确导入rand函数 from pyspark.sql.functions import rand # 执行随机采样 training_data = data.orderBy(rand()).limit(100)
方式二:导入整个functions模块(更推荐)
如果后续要用到多个PySpark函数,建议把整个functions模块命名为F(行业通用写法),这样调用起来更方便:
# 导入functions模块并简写为F from pyspark.sql import functions as F # 用F.rand()调用随机函数 training_data = data.orderBy(F.rand()).limit(100)
为什么你之前的代码会报错?
来逐个分析你遇到的错误原因:
- AttributeError: 'function' object has no attribute 'rand':你用了
from pyspark.sql.functions import rand as F,这是把rand函数直接重命名成了F,此时F是一个函数,不是模块,自然没有F.rand()这个属性。 - ModuleNotFoundError: No module named 'org':
org是Scala语言里的包结构,PySpark完全不需要导入这个,这是混淆了Scala和PySpark的写法。 - NameError: name 'rand' is not defined:你直接调用
rand()但没有提前导入这个函数,Python解释器不知道它是什么,所以报错。
额外小技巧
如果希望每次运行代码时选中的随机行保持一致(方便调试和复现结果),可以给rand函数传入一个固定的种子值:
# 方式一的写法 training_data = data.orderBy(rand(seed=42)).limit(100) # 方式二的写法 training_data = data.orderBy(F.rand(seed=42)).limit(100)
内容的提问来源于stack exchange,提问作者DataBach
相关产品推荐
相关产品推荐

