From cddcea24872a4be353c958c05d13ed6ee49eb73b Mon Sep 17 00:00:00 2001 From: Terence Yim Date: Wed, 19 Feb 2020 17:11:51 +0000 Subject: [PATCH] PARQUET-1802: Use job ClassLoader to load CompressionCodec class The MR job might be having a different ClassLoader then the defining ClassLoader of the CodecFactory class. A CompressionCodec class that is not loadable via the CodecFactory ClassLoader might be loadable through the job ClassLoader. --- .../main/java/org/apache/parquet/hadoop/CodecFactory.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/CodecFactory.java b/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/CodecFactory.java index da87e5d7b6..a03d0455e8 100644 --- a/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/CodecFactory.java +++ b/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/CodecFactory.java @@ -227,7 +227,13 @@ protected CompressionCodec getCodec(CompressionCodecName codecName) { } try { - Class codecClass = Class.forName(codecClassName); + Class codecClass; + try { + codecClass = Class.forName(codecClassName); + } catch (ClassNotFoundException e) { + // Try to load the class using the job classloader + codecClass = configuration.getClassLoader().loadClass(codecClassName); + } codec = (CompressionCodec) ReflectionUtils.newInstance(codecClass, configuration); CODEC_BY_NAME.put(codecClassName, codec); return codec;