[英]Apache dependency bug? org.apache.parquet.hadoop.codec.SnappyCodec was not found Error in apache library
目前正在嘗試在不使用 Spark 的情況下讀取 Java 中的 parquet 文件。 這是我到目前為止所擁有的,基於Adam Melnyk 關於該主題的博客文章。
代碼
ParquetFileReader reader = ParquetFileReader.open(file);
MessageType schema = reader.getFooter().getFileMetaData().getSchema();
List<Type> fields = schema.getFields();
PageReadStore pages;
--> while ((pages = reader.readNextRowGroup()) != null) {
long rows = pages.getRowCount();
LOG.info("Number of rows: " + rows);
MessageColumnIO columnIO = new ColumnIOFactory().getColumnIO(schema);
RecordReader recordReader = columnIO.getRecordReader(pages, new GroupRecordConverter(schema));
for (int i = 0; i < rows; i++) {
SimpleGroup simpleGroup = (SimpleGroup) recordReader.read();
simpleGroups.add(simpleGroup);
}
}
(請注意,箭頭是我的代碼中引發錯誤的行(167))
錯誤信息
org.apache.parquet.hadoop.BadConfigurationException: Class org.apache.parquet.hadoop.codec.SnappyCodec was not found
at org.apache.parquet.hadoop.CodecFactory.getCodec(CodecFactory.java:243)
at org.apache.parquet.hadoop.CodecFactory$HeapBytesDecompressor.<init>(CodecFactory.java:96)
at org.apache.parquet.hadoop.CodecFactory.createDecompressor(CodecFactory.java:212)
at org.apache.parquet.hadoop.CodecFactory.getDecompressor(CodecFactory.java:201)
at org.apache.parquet.hadoop.CodecFactory.getDecompressor(CodecFactory.java:42)
at org.apache.parquet.hadoop.ParquetFileReader$Chunk.readAllPages(ParquetFileReader.java:1519)
at org.apache.parquet.hadoop.ParquetFileReader$Chunk.readAllPages(ParquetFileReader.java:1402)
at org.apache.parquet.hadoop.ParquetFileReader.readChunkPages(ParquetFileReader.java:1023)
at org.apache.parquet.hadoop.ParquetFileReader.readNextRowGroup(ParquetFileReader.java:928)
at [myClassPath]([myClass].java:167)
依賴項
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>3.1.1.3.1.4.0-315</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.1.1.3.1.4.0-315</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-launcher_2.12</artifactId>
<version>3.0.0-preview2</version>
</dependency>
<dependency>
<groupId>org.apache.parquet</groupId>
<artifactId>parquet-avro</artifactId>
<version>1.12.0</version>
</dependency>
似乎無法從 CodecFactory class 中找到 SnappyCodec class,但我查看了我引用的庫,並且 class 在那里: referenced_libraries
CodecFactory 應該能夠識別 SnappyCodec class。 有什么建議嗎? 謝謝
找到了解決方案。
所以問題是 SnappyCodec class 被我為我的應用程序配置的 maven 遮蔽插件遮蔽。
I realized this after packaging the jar with maven, opening that jar with WinZip, and checking the codec directory of the packaged jar (where I found the SanppyCodec.class no longer existed).
解決方案是我需要將以下過濾器添加到我的 maven 陰影插件的配置中:
<filter>
<artifact>org.apache.parquet:parquet-hadoop</artifact>
<includes>
<include>**</include>
</includes>
</filter>
<filter>
<artifact>org.apache.parquet:parquet-column</artifact>
<includes>
<include>**</include>
</includes>
</filter>
<filter>
<artifact>org.apache.parquet:parquet-encoding</artifact>
<includes>
<include>**</include>
</includes>
</filter>
基本上,maven-shade 正在對 parquet-hadoop 工件中看似隨機的類進行着色,因此通過添加<include>
過濾器,maven-shade 不會對其中的任何類進行着色,因此不會對其中的 SnappyCodec.class 文件進行着色。
完成此操作后,我需要添加其他兩個過濾器,因為通過在 parquet-hadoop 工件上使用<include>
標記,它會將所有其他 parquet-* 工件排除在已編譯的 jar 中。 因此,我需要明確告訴它包含 parquet-column 和 parquet-encoding,因為我的應用程序在這些工件中使用了其他一些類。
這種配置意味着 maven-shader 不會觸及這三個工件,這意味着在編譯時間之前存在於這些工件中的任何 class 在使用 maven 編譯/打包它們之后都將保留在那里(因此,將在運行時存在,而它們之前沒有,導致原始錯誤)。 驚人的!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.