spark 2.3.1 上的 dataframe,Describe() 函数抛出 Py4JJavaError

Posted

技术标签:

【中文标题】spark 2.3.1 上的 dataframe,Describe() 函数抛出 Py4JJavaError【英文标题】:dataframe,Describe() function on spark 2.3.1 is throwing Py4JJavaError 【发布时间】:2018-07-30 20:26:19 【问题描述】:

我在 ubuntu 上使用 Spark 2.3.1 和 python 3.6.5。在运行 dataframe.Describe() 函数时,我在 Jupyter Notebook 上遇到错误。

    ---------------------------------------------------------------------------
    Py4JJavaError                             Traceback (most recent call last)
    <ipython-input-19-ea8415b8a3ee> in <module>()
    ----> 1 df.describe()

    ~/spark-2.3.1-bin-hadoop2.7/python/pyspark/sql/dataframe.py in describe(self, *cols)
       1052         if len(cols) == 1 and isinstance(cols[0], list):
       1053             cols = cols[0]
    -> 1054         jdf = self._jdf.describe(self._jseq(cols))
       1055         return DataFrame(jdf, self.sql_ctx)
       1056 

    ~/spark-2.3.1-bin-hadoop2.7/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py in __call__(self, *args)
       1255         answer = self.gateway_client.send_command(command)
       1256         return_value = get_return_value(
    -> 1257             answer, self.gateway_client, self.target_id, self.name)
       1258 
       1259         for temp_arg in temp_args:

    ~/spark-2.3.1-bin-hadoop2.7/python/pyspark/sql/utils.py in deco(*a, **kw)
         61     def deco(*a, **kw):
         62         try:
    ---> 63             return f(*a, **kw)
         64         except py4j.protocol.Py4JJavaError as e:
         65             s = e.java_exception.toString()

    ~/spark-2.3.1-bin-hadoop2.7/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py in get_return_value(answer, gateway_client, target_id, name)
        326                 raise Py4JJavaError(
        327                     "An error occurred while calling 012.\n".
    --> 328                     format(target_id, ".", name), value)
        329             else:
        330                 raise Py4JError(

    Py4JJavaError: An error occurred while calling o132.describe.
    : java.lang.IllegalArgumentException
        at org.apache.xbean.asm5.ClassReader.<init>(Unknown Source)
        at org.apache.xbean.asm5.ClassReader.<init>(Unknown Source)
        at org.apache.xbean.asm5.ClassReader.<init>(Unknown Source)
        at org.apache.spark.util.ClosureCleaner$.getClassReader(ClosureCleaner.scala:46)
        at org.apache.spark.util.FieldAccessFinder$$anon$3$$anonfun$visitMethodInsn$2.apply(ClosureCleaner.scala:449)
        at org.apache.spark.util.FieldAccessFinder$$anon$3$$anonfun$visitMethodInsn$2.apply(ClosureCleaner.scala:432)
        at scala.collection.TraversableLike$WithFilter$$anonfun$foreach$1.apply(TraversableLike.scala:733)
        at scala.collection.mutable.HashMap$$anon$1$$anonfun$foreach$2.apply(HashMap.scala:103)
        at scala.collection.mutable.HashMap$$anon$1$$anonfun$foreach$2.apply(HashMap.scala:103)
        at scala.collection.mutable.HashTable$class.foreachEntry(HashTable.scala:230)
        at scala.collection.mutable.HashMap.foreachEntry(HashMap.scala:40)
        at scala.collection.mutable.HashMap$$anon$1.foreach(HashMap.scala:103)
        at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:732)
        at org.apache.spark.util.FieldAccessFinder$$anon$3.visitMethodInsn(ClosureCleaner.scala:432)
        at org.apache.xbean.asm5.ClassReader.a(Unknown Source)
        at org.apache.xbean.asm5.ClassReader.b(Unknown Source)
        at org.apache.xbean.asm5.ClassReader.accept(Unknown Source)
        at org.apache.xbean.asm5.ClassReader.accept(Unknown Source)
        at org.apache.spark.util.ClosureCleaner$$anonfun$org$apache$spark$util$ClosureCleaner$$clean$14.apply(ClosureCleaner.scala:262)
        at org.apache.spark.util.ClosureCleaner$$anonfun$org$apache$spark$util$ClosureCleaner$$clean$14.apply(ClosureCleaner.scala:261)
        at scala.collection.immutable.List.foreach(List.scala:381)
        at org.apache.spark.util.ClosureCleaner$.org$apache$spark$util$ClosureCleaner$$clean(ClosureCleaner.scala:261)
        at org.apache.spark.util.ClosureCleaner$.clean(ClosureCleaner.scala:159)
        at org.apache.spark.SparkContext.clean(SparkContext.scala:2299)
        at org.apache.spark.SparkContext.runJob(SparkContext.scala:2073)
        at org.apache.spark.SparkContext.runJob(SparkContext.scala:2099)
        at org.apache.spark.rdd.RDD$$anonfun$collect$1.apply(RDD.scala:939)
        at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
        at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112)
        at org.apache.spark.rdd.RDD.withScope(RDD.scala:363)
        at org.apache.spark.rdd.RDD.collect(RDD.scala:938)
        at org.apache.spark.sql.execution.stat.StatFunctions$.aggResult$lzycompute$1(StatFunctions.scala:273)
        at org.apache.spark.sql.execution.stat.StatFunctions$.org$apache$spark$sql$execution$stat$StatFunctions$$aggResult$1(StatFunctions.scala:273)
        at org.apache.spark.sql.execution.stat.StatFunctions$$anonfun$summary$2.apply$mcVI$sp(StatFunctions.scala:286)
        at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:160)
        at org.apache.spark.sql.execution.stat.StatFunctions$.summary(StatFunctions.scala:285)
        at org.apache.spark.sql.Dataset.summary(Dataset.scala:2473)
        at org.apache.spark.sql.Dataset.describe(Dataset.scala:2412)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:564)
        at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
        at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
        at py4j.Gateway.invoke(Gateway.java:282)
        at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
        at py4j.commands.CallCommand.execute(CallCommand.java:79)
        at py4j.GatewayConnection.run(GatewayConnection.java:238)
        at java.base/java.lang.Thread.run(Thread.java:844)

这是我正在使用的测试代码:

    import findspark
    findspark.init('/home/pathirippilly/spark-2.3.1-bin-hadoop2.7')
    from pyspark.sql import SparkSession
    from pyspark.sql.types import  StringType,StructType,StructField,IntegerType
    spark=SparkSession.builder.appName('Basics').getOrCreate()
    df=spark.read.json('people.json')
    df.describe() #not working
    df.describe().show #not working

我已经安装了以下版本的java、scala、python和spark。

    pathirippilly@sparkBox:/usr/lib/jvm$ java -version

openjdk version "10.0.1" 2018-04-17
OpenJDK Runtime Environment (build 10.0.1+10-Ubuntu-3ubuntu1)
OpenJDK 64-Bit Server VM (build 10.0.1+10-Ubuntu-3ubuntu1, mixed mode)

pathirippilly@sparkBox:/usr/lib/jvm$ bashscala -version

Scala code runner version 2.11.12 -- Copyright 2002-2017, LAMP/EPFL

python : 3.6.5

Spark version is spark-2.3.1-bin-hadoop2.7

我的环境变量设置如下。我已将所有这些变量保存在 /etc/environment 并通过 /etc/bash.bashbrc 调用它

JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64"
PYSPARK_DRIVER_OPTION="jupyter"
PYSPARK_DRIVER_PYTHON_OPTS="notebook"
PYSPARK_PYTHON=python3
SPARK_HOME='/home/pathirippilly/spark-2.3.1-bin-hadoop2.7/'
PATH=$SPARK_HOME:$PATH
PYTHONPATH=$SPARK_HOME/python/

另外我还没有配置spark_env.sh。是否需要配置spark_env.sh?

是因为任何可比性问题吗?还是我在这里做错了什么?

如果有人可以将我带到正确的方向,那将非常有帮助。

注意:df.show() 非常适合。

【问题讨论】:

how to fix rdd.collect() error after installing java 10.1?的可能重复 可能,您的 json 在任何键中都有非法参数?试试spark.read.option("charset", "UTF-8").json('people.json') @user8371915 我已编辑并将我的 python/java/scala/spark 版本和 环境变量 添加到原始问题中。我没有将 spark_env.sh 用于任何类型的配置。我检查了spark2.3.1的发布文档,我使用的java版本似乎是兼容的。你能帮我看看我的环境变量设置是否正确吗? 不兼容。您使用 Java 10 或 11,而 Spark 仅支持 Java 8。 @sailesh 我试过了,但没有运气。我使用 2 行和列的小数据框测试了错误。仍然 .describe().count().sum() ..etc 函数不适用于 spark 数据帧。我的 spark 会话已成功创建,并且 .Show()、._printschema()_ 也可以正常工作。 【参考方案1】:

此问题已为我解决。我从头开始重新配置了整个设置。我准备了我的 /etc/environment 文件,如下所示

    export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/$
    export SPARK_HOME='/home/pathirippilly/spark-2.3.1-bin-hadoop2.7'
    export PYTHONPATH=$SPARK_HOME/python:$PYTHONPATH
    export PYSPARK_DRIVER_PYTHON='jupyter'
    export PYSPARK_DRIVER_PYTHON_OPTS='notebook'
    export PYSPARK_PYTHONPATH=python3
    export JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-amd64"
    export PATH=$SPARK_HOME:$PATH:~/.local/bin:$JAVA_HOME/bin:$JAVA_HOME/jre/bin

我在 /etc/bash.bashrc 中添加了下面的行

    source /etc/environment

注意: *

    我的 pyspark 在我的 PYTHONPATH 中可用,所以每次我 在我的终端 /etc/bash.bashrc 中打开一个会话将做源代码 /etc/environment 这将反过来导出所有环境 变量

    我使用了 java-1.8.0-openjdk-amd64 而不是 java 10 或 11。但是 我认为 10 或 11 也可以按照 pyspark 2.3.1 版本工作 文件。不确定。

    我只使用了 scala 2.11.12。

    我的 py4j 模块也可以在我的 PTHONPATH 中使用。

我不知道我之前在哪里搞砸了。但是现在有了上面的设置我的 pyspark 2.3.1 与 Java1.8、Scala 2.11.12、Python 3.6.5(并且没有 findspark 模块)一起工作正常

【讨论】:

【参考方案2】:

OP,我的设置与您的设置完全相同,实际上我们在 Udemy 中遵循相同的 Spark 课程(设置他们对信件所说的一切)并遇到相同的错误在同一个地方。我唯一改变它的工作是Java版本。课程制作时,$ sudo apt-get install default-jre 安装了 8,但现在安装了 11。然后我卸载了 Java 并运行了$ sudo apt-get install openjdk-8-jre 然后将 JAVA_HOME 路径更改为指向它,现在它可以工作了。

【讨论】:

是的..即使我开始使用Java 10。后来改为8。但是为什么spark作者在spark 2.3.1 release doc下面说? Spark runs on Java 8+, Python 2.7+/3.4+ and R 3.1+. For the Scala API, Spark 2.3.1 uses Scala 2.11. You will need to use a compatible Scala version (2.11.x) Java 8+ 是指 Java 8 版本还是 Java 8 及以上版本?通过配置 bash.bashrc 文件的任何方式,正如我在下一节中解释的那样,现在我可以从本地的任何位置运行或导入 pyspark,而无需使用“findspark”【参考方案3】:

我在 Udemy 中学习相同的 Spark 课程时遇到了同样的错误。以下是我为解决该问题所遵循的步骤。

删除 openjdk 版本 11:

1)sudo apt-get autoremove default-jdk openjdk-11-jdk 它会要求确认,请提供相同的。 2)sudo apt-get remove default-jre.

安装 jdk 8 并进行配置 3)sudo apt-get install openjdk-8-jre 将 JAVA_HOME 指向这个新安装的 jdk 4)导出JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-amd64"

按照上述方法,来自 df.describe() 的错误得到了解决。

【讨论】:

以上是关于spark 2.3.1 上的 dataframe,Describe() 函数抛出 Py4JJavaError的主要内容,如果未能解决你的问题,请参考以下文章

Dataframe Spark 2.2.1上的可调用列对象

带有浮点数 Spark 1.6 的 DataFrame 上的 SQL 百分位数 - 任何可能的解决方法? [复制]

使用 Scala 将多列转换为 Spark Dataframe 上的一列地图

Spark- How to concatenate DataFrame columns

Spark - 如何将 JSON 转义的字符串字段解析为 DataFrames 中的 JSON 对象?

如何在加入(广播)和使用 Spark 收集之间进行选择