/* * 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.flink.addons.hbase; import org.apache.flink.api.common.functions.MapFunction; import org.apache.flink.api.java.DataSet; import org.apache.flink.api.java.ExecutionEnvironment; import org.apache.flink.api.java.io.LocalCollectionOutputFormat; import org.apache.flink.api.java.tuple.Tuple1; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.Scan; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import java.io.IOException; import java.util.ArrayList; import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class TableInputFormatITCase extends HBaseTestingClusterAutostarter { private static final String TEST_TABLE_NAME = "TableInputFormatTestTable"; private static final byte[] TEST_TABLE_FAMILY_NAME = "F".getBytes(); private static final byte[] TEST_TABLE_COLUMN_NAME = "Col".getBytes(); // These are the row ids AND also the values we will put in the test table private static final String[] ROW_IDS = {"000", "111", "222", "333", "444", "555", "666", "777", "888", "999"}; @BeforeClass public static void activateHBaseCluster(){ registerHBaseMiniClusterInClasspath(); } @Before public void createTestTable() throws IOException { TableName tableName = TableName.valueOf(TEST_TABLE_NAME); byte[][] splitKeys = {"0".getBytes(), "3".getBytes(), "6".getBytes(), "9".getBytes()}; createTable(tableName, TEST_TABLE_FAMILY_NAME, splitKeys); HTable table = openTable(tableName); for (String rowId : ROW_IDS) { byte[] rowIdBytes = rowId.getBytes(); Put p = new Put(rowIdBytes); // Use the rowId as the value to facilitate the testing better p.add(TEST_TABLE_FAMILY_NAME, TEST_TABLE_COLUMN_NAME, rowIdBytes); table.put(p); } table.close(); } class InputFormatForTestTable extends TableInputFormat<Tuple1<String>> { @Override protected Scan getScanner() { return new Scan(); } @Override protected String getTableName() { return TEST_TABLE_NAME; } @Override protected Tuple1<String> mapResultToTuple(Result r) { return new Tuple1<>(new String(r.getValue(TEST_TABLE_FAMILY_NAME, TEST_TABLE_COLUMN_NAME))); } } @Test public void testTableInputFormat() { ExecutionEnvironment environment = ExecutionEnvironment.getExecutionEnvironment(); environment.setParallelism(1); DataSet<String> resultDataSet = environment.createInput(new InputFormatForTestTable()).map(new MapFunction<Tuple1<String>, String>() { @Override public String map(Tuple1<String> value) throws Exception { return value.f0; } }); List<String> resultSet = new ArrayList<>(); resultDataSet.output(new LocalCollectionOutputFormat<>(resultSet)); try { environment.execute("HBase InputFormat Test"); } catch (Exception e) { Assert.fail("HBase InputFormat test failed. " + e.getMessage()); } for (String rowId : ROW_IDS) { assertTrue("Missing rowId from table: " + rowId, resultSet.contains(rowId)); } assertEquals("The number of records is wrong.", ROW_IDS.length, resultSet.size()); } }