2017-07-19 63 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,這是我查詢的行數。所以這是正確的。 –