当单个记录的大小超过3gb时,我会遇到以下异常`
java.lang.IllegalArgumentException
App > at java.nio.CharBuffer.allocate(CharBuffer.java:330)
App > at java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:792)
App > at org.apache.hadoop.io.Text.decode(Text.java:412)
App > at org.apache.hadoop.io.Text.decode(Text.java:389)
App > at org.apache.hadoop.io.Text.toString(Text.java:280)
App > at org.apache.spark.sql.execution.datasources.json.JsonFileFormat$$anonfun$createBaseRdd$1.apply(JsonFileFormat.scala:135)
App > at org.apache.spark.sql.execution.datasources.json.JsonFileFormat$$anonfun$createBaseRdd$1.apply(JsonFileFormat.scala:135)
如何增加单个记录的缓冲区大小?
1条答案
按热度按时间k75qkfdt1#
您的文件中可能有一个包含数组的大行。这里有一个异常,因为您试图构建一个太大的charbuffer(很可能是一个在越界后变为负数的整数)。java中的最大数组/字符串大小是2^31-1(integer.max\u value-1)(请参阅此线程)。你说你有一个3gb的记录,每个字符1b,可以产生30亿个字符,超过2^31,大约等于20亿。
t你能做的有点麻烦,但由于你只有一个大数组的键,它可能会工作。您的json文件可能如下所示:
或者像这样,但我认为你的情况是前者:
因此,您可以尝试将hadoop使用的行分隔符更改为“,”如下所示。基本上,他们是这样做的:
然后您可以读取数组,只需自己删除json括号,如下所示:
请注意,如果您的记录可以包含字符“[”和“]”,那么您必须更加小心,但这里是一个想法。