public Map<String, ArrayList<RowData>> getObjectsFromTable(
			String tableName, String columnFamily, String startRange,
			String endRange, String... retrieveColumns) throws IOException {

		// Validate the tableName
		if (!validateStringIfNullOrEmpty(tableName)) {
			throw new IllegalArgumentException(
					"Invalid tableName input to HBaseConnectionUtil.getObjectsFromTable");
		}

		// Scan object to loop through the Table to find the objects
		Scan scan = new Scan();
		byte[] columnFamilyBytes = Bytes.toBytes(columnFamily);
		scan.addFamily(columnFamilyBytes);

		// Add the filter for columns to be retrieved
		if (retrieveColumns != null && retrieveColumns.length > 0) {
			for (String columnName : retrieveColumns)
				scan.addColumn(columnFamilyBytes, Bytes.toBytes(columnName));
		}

		// Get the table object refered by the tableName
		HTableInterface table = getHTable(tableName);

		// Check if the startRange and endRange are given
		// If yes, set the start and end range for the scan object created above
		if (validateStringIfNullOrEmpty(startRange, endRange)) {
			scan.setStartRow(Bytes.toBytes(startRange));
			scan.setStopRow(Bytes.toBytes(endRange));
		}

		// Create a Data Structure to store the data from the table
		// Key for the Map is a String i.e. the rowID for the given table
		// Value is an ArrayList of RowData. RowData is going to be used to save
		// the
		// Key-Value pairs inside the column family
		Map<String, ArrayList<RowData>> resultSet = new HashMap<String, ArrayList<RowData>>();

		// Initiate the Scanning of the Table
		ResultScanner scanner = table.getScanner(scan);

		RowData rowData = null;
		String rowId = null;
		ArrayList<RowData> mapValue;

		// Looping through the Scanned Result
		for (Result result : scanner) {
			// Extracting the KeyValue pair for each row inside the column
			// family
			for (KeyValue keyValue : result.raw()) {
				rowData = new RowData();
				rowData.setKey(Bytes.toString(keyValue.getQualifier()));
				rowData.setValue(Bytes.toString(keyValue.getValue()));
				rowId = Bytes.toString(result.getRow());

				// Check if the Map contains the rowID
				// if yes, re-use the corresponding ArrayList to store the new
				// RowData object
				// or else create a new one
				if (resultSet.containsKey(rowId)) {
					mapValue = resultSet.get(rowId);
				} else {
					mapValue = new ArrayList<RowData>();
				}

				// Storing the new RowData object inside the ArrayList
				mapValue.add(rowData);

				// Saving it inside the Map
				resultSet.put(rowId, mapValue);
			}
		}
		return resultSet;
	}