diff --git a/src/java/org/apache/sqoop/tool/BaseSqoopTool.java b/src/java/org/apache/sqoop/tool/BaseSqoopTool.java index 13a9697b..468bf346 100644 --- a/src/java/org/apache/sqoop/tool/BaseSqoopTool.java +++ b/src/java/org/apache/sqoop/tool/BaseSqoopTool.java @@ -1689,6 +1689,11 @@ protected void validateHBaseOptions(SqoopOptions options) BaseSqoopTool.HBASE_TABLE_ARG); throw new InvalidOptionsException(validationMessage); } + + if (options.getHBaseTable() != null && options.getFileLayout() != SqoopOptions.FileLayout.TextFile) { + String validationMessage = String.format("Can't run HBase import with file layout: %s", options.getFileLayout()); + throw new InvalidOptionsException(validationMessage); + } } /** diff --git a/src/test/org/apache/sqoop/tool/ImportToolValidateOptionsTest.java b/src/test/org/apache/sqoop/tool/ImportToolValidateOptionsTest.java index 503a8634..a7921511 100644 --- a/src/test/org/apache/sqoop/tool/ImportToolValidateOptionsTest.java +++ b/src/test/org/apache/sqoop/tool/ImportToolValidateOptionsTest.java @@ -5,12 +5,39 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; +import java.util.Arrays; + +import static com.cloudera.sqoop.SqoopOptions.FileLayout.SequenceFile; +import static com.cloudera.sqoop.SqoopOptions.FileLayout.AvroDataFile; +import static com.cloudera.sqoop.SqoopOptions.FileLayout.ParquetFile; +import static com.cloudera.sqoop.SqoopOptions.FileLayout.TextFile; + +@RunWith(Parameterized.class) public class ImportToolValidateOptionsTest { + @Parameters(name = "fileLayout = {0}, validationMessage = {1}") + public static Iterable fileLayoutAndValidationMessageParameters() { + return Arrays.asList(new Object[] {SequenceFile, String.format("Can't run HBase import with file layout: %s", SequenceFile)}, + new Object[] {AvroDataFile, String.format("Can't run HBase import with file layout: %s", AvroDataFile)}, + new Object[] {ParquetFile, String.format("Can't run HBase import with file layout: %s", ParquetFile)}); + } + private static final String TABLE_NAME = "testTableName"; private static final String CONNECT_STRING = "testConnectString"; private static final String CHECK_COLUMN_NAME = "checkColumnName"; + private static final String HBASE_TABLE_NAME = "testHBaseTableName"; + private static final String HBASE_COL_FAMILY = "testHBaseColumnFamily"; + private SqoopOptions.FileLayout fileLayout; + private String validationMessage; + + public ImportToolValidateOptionsTest(SqoopOptions.FileLayout fileLayout, String validationMessage) { + this.fileLayout = fileLayout; + this.validationMessage = validationMessage; + } @Rule public ExpectedException thrown = ExpectedException.none(); @@ -81,6 +108,31 @@ public void testValidationSucceedsWithHiveImportAndAppendModeAndIncrementalAppen importTool.validateOptions(options); } + @Test + public void testValidationFailsWithHBaseImportAndFileLayoutDifferentFromTexFile() throws Exception { + SqoopOptions options = buildBaseSqoopOptions(); + options.setHBaseTable(HBASE_TABLE_NAME); + options.setHBaseColFamily(HBASE_COL_FAMILY); + options.setFileLayout(fileLayout); + + thrown.expect(SqoopOptions.InvalidOptionsException.class); + thrown.expectMessage(validationMessage); + + importTool.validateOptions(options); + } + + @Test + public void testValidationSucceedsWithHBaseImportAndAsTextFile() throws Exception { + SqoopOptions options = buildBaseSqoopOptions(); + options.setHBaseTable(HBASE_TABLE_NAME); + options.setHBaseColFamily(HBASE_COL_FAMILY); + options.setFileLayout(TextFile); + + thrown.none(); + + importTool.validateOptions(options); + } + private SqoopOptions buildBaseSqoopOptions() { SqoopOptions result = new SqoopOptions(); result.setTableName(TABLE_NAME);