[ https://issues.apache.org/jira/browse/PARQUET-2196?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17622577#comment-17622577 ]
ASF GitHub Bot commented on PARQUET-2196: ----------------------------------------- wgtmac commented on code in PR #1000: URL: https://github.com/apache/parquet-mr/pull/1000#discussion_r1002407221 ########## parquet-hadoop/src/main/java/org/apache/parquet/hadoop/codec/Lz4RawCodec.java: ########## @@ -0,0 +1,112 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.parquet.hadoop.codec; + +import org.apache.hadoop.conf.Configurable; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.io.compress.CompressionCodec; +import org.apache.hadoop.io.compress.CompressionInputStream; +import org.apache.hadoop.io.compress.CompressionOutputStream; +import org.apache.hadoop.io.compress.Compressor; +import org.apache.hadoop.io.compress.Decompressor; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +/** + * Lz4 raw compression codec for Parquet. This codec type has been introduced + * into the parquet format since version 2.9.0. It differs from the Lz4Codec + * shipped with Apache Hadoop by removing the light frame header which includes + * 4 byte for uncompressed length and 4 byte for compressed length. In the + * Apache Arrow implementation, these two Lz4 codecs are recognized as LZ4_RAW + * and LZ4_HADOOP to minimize the confusion at its best. Please check the link + * below for reference. + * https://github.com/apache/parquet-format/blob/master/Compression.md + */ +public class Lz4RawCodec implements Configurable, CompressionCodec { + + private Configuration conf; + + // Hadoop config for how big to make intermediate buffers. + public static final String BUFFER_SIZE_CONFIG = "io.file.buffer.size"; + + private static final int DEFAULT_BUFFER_SIZE_CONFIG = 4 * 1024; Review Comment: In order to keep the same behavior with the snappy codec, I think it is better to keep the same default value. ########## parquet-hadoop/src/main/java/org/apache/parquet/hadoop/codec/NonBlockedCompressor.java: ########## @@ -0,0 +1,186 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.parquet.hadoop.codec; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.io.compress.Compressor; +import org.apache.parquet.Preconditions; + +import java.io.IOException; +import java.nio.ByteBuffer; + +/** + * This class is a wrapper around the underlying compressor. It always consumes + * the entire input in setInput and compresses it as one compressed block. + */ +abstract public class NonBlockedCompressor implements Compressor { + + // Buffer for compressed output. This buffer grows as necessary. + private ByteBuffer outputBuffer = ByteBuffer.allocateDirect(0); + + // Buffer for uncompressed input. This buffer grows as necessary. + private ByteBuffer inputBuffer = ByteBuffer.allocateDirect(0); + + private long bytesRead = 0L; + private long bytesWritten = 0L; + private boolean finishCalled = false; + + /** + * Fills specified buffer with compressed data. Returns actual number + * of bytes of compressed data. A return value of 0 indicates that + * needsInput() should be called in order to determine if more input + * data is required. + * + * @param buffer Buffer for the compressed data + * @param off Start offset of the data + * @param len Size of the buffer + * @return The actual number of bytes of compressed data. + */ + @Override + public synchronized int compress(byte[] buffer, int off, int len) throws IOException { + SnappyUtil.validateBuffer(buffer, off, len); Review Comment: I've added a comment for explanation. > Support LZ4_RAW codec > --------------------- > > Key: PARQUET-2196 > URL: https://issues.apache.org/jira/browse/PARQUET-2196 > Project: Parquet > Issue Type: Improvement > Components: parquet-mr > Reporter: Gang Wu > Priority: Major > > There is a long history about the LZ4 interoperability of parquet files > between parquet-mr and parquet-cpp (which is now in the Apache Arrow). > Attached links are the evidence. In short, a new LZ4_RAW codec type has been > introduced since parquet format v2.9.0. However, only parquet-cpp supports > LZ4_RAW. The parquet-mr library still uses the old Hadoop-provided LZ4 codec > and cannot read parquet files with LZ4_RAW. -- This message was sent by Atlassian Jira (v8.20.10#820010)