【问题标题】:Python Round Function Issues with pysparkpyspark 的 Python 循环函数问题
【发布时间】:2020-12-23 20:24:17
【问题描述】:

我对 spark 比较陌生,在导入 pyspark 函数后尝试使用 python 的内置 round() 函数时遇到了问题。这似乎与我如何导入 pyspark 函数有关,但我不确定有什么区别或者为什么一种方法会导致问题而另一种不会。

预期行为:

import pyspark.sql.functions
print(round(3.14159265359,2))
>>> 3.14

意外行为:

from pyspark.sql.functions import *
print(round(3.14159265359,2))
>>> ERROR

AttributeError                            Traceback (most recent call last)
<ipython-input-1-50155ca4fa82> in <module>()
      1 from pyspark.sql.functions import *
----> 2 print(round(3.1454848383,2))

/opt/spark/python/pyspark/sql/functions.py in round(col, scale)
    503     """
    504     sc = SparkContext._active_spark_context
--> 505     return Column(sc._jvm.functions.round(_to_java_column(col), scale))
    506 
    507 

AttributeError: 'NoneType' object has no attribute '_jvm'

【问题讨论】:

  • 我认为你需要在使用这个函数之前初始化一个火花上下文。在错误 'NoneType' 对象没有属性 '_jvm' ==> sc is NoneType ==> SparkContext 不存在。第一种情况有效,因为它仍然使用本机轮函数,如果要使用 pyspark 函数,则必须调用 pyspark.sql.functions.round(3.14159265359,2)
  • 但就是这样,我不想使用 pyspark 圆形功能。如果我执行“from pyspark.sql.functions import *”,就好像 pyspark 正在重载 round() 函数...?
  • @MGriggs “好像 pyspark 正在重载 round() 函数...?” 正是它在做什么。您还期望import * 怎么工作?请阅读why is import * bad?

标签: python pyspark rounding


【解决方案1】:

导入import pyspark.sql.functions as F 以避免冲突。

这样就可以正常使用所有python内置函数了,当你想使用pyspark函数时,将它们作为F.round使用

【讨论】:

  • 我在下面给出了如何使用 DataFrame 的答案。看到这个答案后,我意识到我误解了这个问题。将函数导入为 F 是常见的做法。您也可以使用__builtin__.round() 引用python 轮次,但这很难看。删除我的错误答案。
  • OP 在他的评论中特别提到他不想使用 pyspark 函数。是的,这确实使它变得丑陋,也许我认为最好采用常见做法:)
【解决方案2】:

不要做 import * 因为它会弄乱你的命名空间。

Pyspark 具有圆形功能: http://spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html#pyspark.sql.functions.round

所以内置函数 round 正在被 pyspark.sql.functions.round 取代

【讨论】:

    【解决方案3】:

    如果你有一段很长的代码,你使用了 pyspark.sql.functions 而没有像 F 这样的任何引用。那么为了专门使用 python round,你可以在 pyspark 代码中使用__builtins__.round()。 @michael_west 几乎是对的,但模块应该是 __builtins__ 而不是 __builtin__. 示例代码:

    from builtins import round
    
    k = round(123.456)
    

    【讨论】:

    • 我正准备着手修复所有其他人的代码使用pyspark.sql.functions.round的地方,这样我就可以使用内置的round,但忘记了@的存在987654327@ 模块。在截止日期前,时间紧迫,更容易import builtins 然后再打电话给builtins.round,所以谢谢你的回答!
    【解决方案4】:

    这里有同样的问题,我不想为 pyspark.sql.functions 起别名,所以只在此处为轮次起别名。

    from pyspark.sql.functions import round as sqlround
    

    【讨论】:

    • 这是一个解决方案还是你说你有类似的问题?
    • @Ruli 这对我来说似乎是一个有效的解决方案。
    • @mck 是的,但描述有点混乱,这就是问题的原因
    猜你喜欢
    • 1970-01-01
    • 2021-03-15
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多