python - Pyspark 'NoneType'对象没有属性 '_jvm'错误

标签 python apache-spark pyspark apache-spark-sql

我试图使用 Spark 2.2 打印 DataFrame 中每个分区中的总元素

from pyspark.sql.functions import *
from pyspark.sql import SparkSession

def count_elements(splitIndex, iterator):
    n = sum(1 for _ in iterator)
    yield (splitIndex, n)

spark = SparkSession.builder.appName("tmp").getOrCreate()
num_parts = 3
df = spark.read.json("/tmp/tmp/gon_s.json").repartition(num_parts)
print("df has partitions."+ str(df.rdd.getNumPartitions()))
print("Elements across partitions is:" + str(df.rdd.mapPartitionsWithIndex(lambda ind, x: count_elements(ind, x)).take(3)))

上面的代码一直失败,并出现以下错误

  n = sum(1 for _ in iterator)
  File "/home/dev/wk/pyenv/py3/lib/python3.5/site-packages/pyspark/python/lib/pyspark.zip/pyspark/sql/functions.py", line 40, in _
    jc = getattr(sc._jvm.functions, name)(col._jc if isinstance(col, Column) else col)
AttributeError: 'NoneType' object has no attribute '_jvm'

删除下面的导入后

from pyspark.sql.functions import *

代码运行良好

skewed_large_df has partitions.3
The distribution of elements across partitions is:[(0, 1), (1, 2), (2, 2)]

是什么原因导致此错误以及如何修复它?

最佳答案

这是 why you shouldn't use import * 的一个很好的例子.

线路

from pyspark.sql.functions import *

会将 pyspark.sql.functions 模块中的所有函数引入您的命名空间,包括一些会影响您的内置函数的函数。

具体问题在count_elements函数一行:

n = sum(1 for _ in iterator)
#   ^^^ - this is now pyspark.sql.functions.sum

您打算调用 __builtin__.sum,但 import * 隐藏了内置函数。

相反,请执行以下操作之一:

import pyspark.sql.functions as f

或者

from pyspark.sql.functions import sum as sum_

关于python - Pyspark 'NoneType'对象没有属性 '_jvm'错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49481363/

相关文章:

python - 为什么我在用 python 抓取时无法获取字符串?

hadoop - Flume流GZ文件

apache-spark - 在pyspark中以分布式方式高效生成大型DataFrame(无pyspark.sql.Row)

python - 将 ByteArray 从 Python 传递给 C 函数

python - 显示输出时出错 - Python - SQLite

python - 计算列之间加权乘积之和的最快方法是什么?

apache-spark - 如何将 spark-shell 连接到 Mesos?

security - 大数据集群(Hadoop,Spark等)中的副本是否由同一系统管理员管理?

python - 使用 PySpark 进行高效的文本预处理(清理、标记化、停用词、词干提取、过滤)

python - 统一码编码错误 : 'ascii' codec can't encode character error