2017-07-19 141 views
0

我有我的df一个问题,运行星火2.1.0,有从蜂房DB SQL查询创建了几个字符串列,让这个.summary()PySpark GROUPBY计数失败,show方法

DataFrame[summary: string, visitorid: string, eventtype: string, ..., target: string]

如果我只运行df.groupBy("eventtype").count(),它的工作原理,我得到DataFrame[eventtype: string, count: bigint]

当节目df.groupBy('eventtype').count().show()运行,我不断收到:

Traceback (most recent call last): 
    File "/tmp/zeppelin_pyspark-9040214714346906648.py", line 267, in <module> 
    raise Exception(traceback.format_exc()) 
Exception: Traceback (most recent call last): 
    File "/tmp/zeppelin_pyspark-9040214714346906648.py", line 265, in <module> 
    exec(code) 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/spark/python/pyspark/sql/dataframe.py", line 318, in show 
    print(self._jdf.showString(n, 20)) 
    File "/usr/lib/spark/python/lib/py4j-0.10.4-src.zip/py4j/java_gateway.py", line 1133, in __call__ 
    answer, self.gateway_client, self.target_id, self.name) 
    File "/usr/lib/spark/python/pyspark/sql/utils.py", line 63, in deco 
    return f(*a, **kw) 
    File "/usr/lib/spark/python/lib/py4j-0.10.4-src.zip/py4j/protocol.py", line 319, in get_return_value 
    format(target_id, ".", name), value) 

Py4JJavaError: An error occurred while calling o4636.showString. 
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 633.0 failed 4 times, most recent failure: Lost task 0.3 in stage 633.0 (TID 19944, ip-172-31-28-173.eu-west-1.compute.internal, executor 440): java.lang.NullPointerException 

我不知道什么是错的显示方法(既非的其他列可以工作,而不是我创建的事件列target)。集群的管理员也无法帮助我。

任何指针

+0

我假设你正在使用Zeppelin。 'z.show(df.groupBy('eventtype')。count())'工作吗? –

+0

是的,我正在使用zeppelin - 有趣的想法!它会引发稍微不同的错误..'Py4JJavaError:调用z:org.apache.zeppelin.spark.ZeppelinContext.showDF时发生错误。 :org.apache.zeppelin.interpreter.InterpreterException:java.lang.reflect.InvocationTargetException'我应该编辑我的Q并添加整个错误消息吗? –

回答

0

存在一些问题,目前我们知道如果您的DataFrame包含一些限制的问题。如果是的话,你可能走进https://issues.apache.org/jira/browse/SPARK-18528

这意味着,你必须星火版本升级到2.1.1或者你可以使用repartition作为一种变通方法来避免这个问题

正如@AssafMendelson说,计数()只创建新的DataFrame,但不启动计算。表演或头部将开始计算。

如果Jira票和升级没有帮助你,请发布工作人员的日志

+0

嗨,谢谢!我没有使用.limit,只有2个类,我没有在DF中指定任何限制(反正它是什么?)。但是当我尝试使用重新分区时,你的链接解决了它。 'df.repartition('eventtype')。groupBy('eventtype')。count()。show()'确定!如果你想添加它在你的答案,所以我可以接受它? –

+0

@JanSila好的我提到了这个:) –

+0

虽然它有点有趣。花了一天的时间,可以找到它没有文件或教程。即使我不使用限制,为什么会发生这种情况? –

0

非常感谢您在运行

df.groupBy("eventtype").count() 

你是如何计算的结果和实际定义一个懒惰的转变。无论数据大小如何,这将立即返回一个新的数据帧。当你打电话给你时,你正在执行一个动作,这是实际计算开始的时间。

如果你看看你的错误日志的底部:

org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 633.0 failed 4 times, most recent failure: Lost task 0.3 in stage 633.0 (TID 19944, ip-172-31-28-173.eu-west-1.compute.internal, executor 440): java.lang.NullPointerException 

你可以看到任务的一个失败,因为一个空指针异常。我会去检查df的定义以查看之前发生的事情(甚至可以看看是否仅仅执行df.count()会导致异常)。

+0

嗨,感谢你的回答,当我运行'df.count()'时,它显示100k,这是我查询的行数。所以这是正确的。 –