/** * 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.hadoop.hive.cli; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.PrintStream; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hive.ql.io.RCFile; import org.apache.hadoop.hive.ql.io.RCFileOutputFormat; import org.apache.hadoop.hive.serde2.columnar.BytesRefArrayWritable; import org.apache.hadoop.hive.serde2.columnar.BytesRefWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.io.compress.DefaultCodec; import org.junit.Test; /** * test RCFileCat * */ public class TestRCFileCat { /** * test parse file */ @Test public void testRCFileCat() throws Exception { File template = File.createTempFile("hive", "tmpTest"); Configuration configuration = new Configuration(); byte[][] record_1 = { Bytes.toBytes("123"), Bytes.toBytes("456"), Bytes.toBytes("789"), Bytes.toBytes("1000"), Bytes.toBytes("5.3"), Bytes.toBytes("hive and hadoop"), new byte[0], Bytes.toBytes("NULL") }; byte[][] record_2 = { Bytes.toBytes("100"), Bytes.toBytes("200"), Bytes.toBytes("123"), Bytes.toBytes("1000"), Bytes.toBytes("5.3"), Bytes.toBytes("hive and hadoop"), new byte[0], Bytes.toBytes("NULL") }; byte[][] record_3 = { Bytes.toBytes("200"), Bytes.toBytes("400"), Bytes.toBytes("678"), Bytes.toBytes("1000"), Bytes.toBytes("4.8"), Bytes.toBytes("hive and hadoop"), new byte[0], Bytes.toBytes("TEST") }; RCFileOutputFormat.setColumnNumber(configuration, 8); Path file = new Path(template.getAbsolutePath()); FileSystem fs = FileSystem.getLocal(configuration); RCFile.Writer writer = new RCFile.Writer(fs, configuration, file, null, RCFile.createMetadata(new Text("apple"), new Text("block"), new Text( "cat"), new Text("dog")), new DefaultCodec()); write(writer, record_1); write(writer, record_2); write(writer, record_3); writer.close(); RCFileCat fileCat = new RCFileCat(); fileCat.test=true; fileCat.setConf(new Configuration()); // set fake input and output streams PrintStream oldOutPrintStream= System.out; PrintStream oldErrPrintStream= System.err; ByteArrayOutputStream dataOut= new ByteArrayOutputStream(); ByteArrayOutputStream dataErr= new ByteArrayOutputStream(); System.setOut(new PrintStream(dataOut)); System.setErr(new PrintStream(dataErr)); try { String[] params = {"--verbose","file://" + template.toURI().getPath() }; assertEquals(0, fileCat.run(params)); assertTrue(dataOut.toString().contains("123\t456\t789\t1000\t5.3\thive and hadoop\t\tNULL")); assertTrue(dataOut.toString().contains("100\t200\t123\t1000\t5.3\thive and hadoop\t\tNULL")); assertTrue(dataOut.toString().contains("200\t400\t678\t1000\t4.8\thive and hadoop\t\tTEST")); dataOut.reset(); params = new String[] { "--start=-10","--file-sizes", "file://" + template.toURI().getPath() }; assertEquals(0, fileCat.run(params)); assertTrue(dataOut.toString().contains("File size (uncompressed): 105. File size (compressed): 134. Number of rows: 3.")); dataOut.reset(); params = new String[] {"--start=0", "--column-sizes","file://" + template.toURI().getPath() }; assertEquals(0, fileCat.run(params)); assertTrue(dataOut.toString().contains("0\t9\t17")); assertTrue(dataOut.toString().contains("1\t9\t17")); assertTrue(dataOut.toString().contains("2\t9\t17")); assertTrue(dataOut.toString().contains("3\t12\t14")); assertTrue(dataOut.toString().contains("4\t9\t17")); assertTrue(dataOut.toString().contains("5\t45\t26")); dataOut.reset(); params = new String[] {"--start=0", "--column-sizes-pretty", "file://" + template.toURI().getPath() }; assertEquals(0, fileCat.run(params)); assertTrue(dataOut.toString().contains("Column 0: Uncompressed size: 9 Compressed size: 17")); assertTrue(dataOut.toString().contains("Column 1: Uncompressed size: 9 Compressed size: 17")); assertTrue(dataOut.toString().contains("Column 2: Uncompressed size: 9 Compressed size: 17")); assertTrue(dataOut.toString().contains("Column 3: Uncompressed size: 12 Compressed size: 14")); assertTrue(dataOut.toString().contains("Column 4: Uncompressed size: 9 Compressed size: 17")); assertTrue(dataOut.toString().contains("Column 5: Uncompressed size: 45 Compressed size: 26")); params = new String[] { }; assertEquals(-1, fileCat.run(params)); assertTrue(dataErr.toString().contains("RCFileCat [--start=start_offet] [--length=len] [--verbose] " + "[--column-sizes | --column-sizes-pretty] [--file-sizes] fileName")); dataErr.reset(); params = new String[] { "--fakeParameter", "file://" + template.toURI().getPath()}; assertEquals(-1, fileCat.run(params)); assertTrue(dataErr.toString().contains("RCFileCat [--start=start_offet] [--length=len] [--verbose] " + "[--column-sizes | --column-sizes-pretty] [--file-sizes] fileName")); } finally { // restore input and output streams System.setOut(oldOutPrintStream); System.setErr(oldErrPrintStream); } } private void write(RCFile.Writer writer, byte[][] record) throws IOException { BytesRefArrayWritable bytes = new BytesRefArrayWritable(record.length); for (int i = 0; i < record.length; i++) { BytesRefWritable cu = new BytesRefWritable(record[i], 0, record[i].length); bytes.set(i, cu); } writer.append(bytes); } }