問題
您的Apache Spark作業失敗無法增長BufferHolder錯誤。
illegalargumentexception:無法按大小XXXXXXXXX增長BufferHolder,因為增長後的大小超過了大小限製2147483632
導致
BufferHolder最大大小為2147483632字節(大約2 GB)。
如果列值超過這個大小,Spark將返回異常。
這可能發生在使用聚合時collect_list.
此示例代碼在超過的最大大小的列值中生成副本BufferHolder.結果,它返回一個無法增長BufferHolder在筆記本中運行時出錯。
sql進口org.apache.spark.sql.functions %。_ spark.range(10000000)。withColumn("id1",lit(" jkdhdbjasdshdjkqgdkkasldksashjckabacbaskcbakshckjasbc $%^^&&&&&* jxcfdkwbfkjwdqndlkjqjjkdbdjkbqjjkdbvnxbaskxqbhwdhqjskdjxbsjsjkjsdbkqsjdjdkqsbqsshdjsdhqksjdhdhkjsdhjqskxb kqscsc "). groupby ("id1")。gg (collect_list (id1) .alias(“天”)。顯示()
解決方案
必須確保列值不超過2147483632字節。這可能需要你調整處理筆記本數據的方式。
看看我們的示例代碼,使用collect_set而不是collect_list解決了這個問題,並允許示例運行到完成。這個單一的更改能夠工作,因為示例數據集包含大量重複的條目。
sql進口org.apache.spark.sql.functions %。_ spark.range(10000000)。withColumn("id1",lit(" jkdhdbjasdshdjkqgdkkasldksashjckabacbaskcbakshckjasbc $%^^&&&&&* jxcfdkwbfkjwdqndlkjqjjkdbdjkbqjjkdbvnxbaskxqbhwdhqjskdjxbsjsjkjsdbkqsjdjdkqsbqsshdjsdhqksjdhdhkjsdhjqskxb kqscsc "). groupby ("id1")。gg (collect_set (id1) .alias(“天”)。顯示()
如果使用collect_set不保留下麵的列的大小BufferHolder2147483632字節的限製無法增長BufferHolder錯誤仍然發生。在本例中,我們必須將列表拆分為多個DataFrames,並將其作為單獨的文件寫入。