From dd233128f10df17f319bf06a3cbe92507680a5e6 Mon Sep 17 00:00:00 2001 From: Hsuan-Yi Chu Date: Fri, 29 Jan 2016 13:20:12 -0800 Subject: [PATCH] DRILL-4323: When converting HiveParquetScan To DrillParquetScan, do not add Project when no column is needed to be read out from Scan (e.g., select count(*) from hive.table) --- ...ConvertHiveParquetScanToDrillParquetScan.java | 9 ++++++--- .../apache/drill/exec/hive/TestHiveStorage.java | 9 ++++++++- .../exec/hive/TestInfoSchemaOnHiveStorage.java | 1 + .../exec/store/hive/HiveTestDataGenerator.java | 16 ++++++++++++++++ 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/planner/sql/logical/ConvertHiveParquetScanToDrillParquetScan.java b/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/planner/sql/logical/ConvertHiveParquetScanToDrillParquetScan.java index a1933be0bf1..97a5b9813d8 100644 --- a/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/planner/sql/logical/ConvertHiveParquetScanToDrillParquetScan.java +++ b/contrib/storage-hive/core/src/main/java/org/apache/drill/exec/planner/sql/logical/ConvertHiveParquetScanToDrillParquetScan.java @@ -177,9 +177,12 @@ public void onMatch(RelOptRuleCall call) { getPartitionColMapping(hiveTable, partitionColumnLabel); final DrillScanRel nativeScanRel = createNativeScanRel(partitionColMapping, hiveScanRel); - final DrillProjectRel projectRel = createProjectRel(hiveScanRel, partitionColMapping, nativeScanRel); - - call.transformTo(projectRel); + if(hiveScanRel.getRowType().getFieldCount() == 0) { + call.transformTo(nativeScanRel); + } else { + final DrillProjectRel projectRel = createProjectRel(hiveScanRel, partitionColMapping, nativeScanRel); + call.transformTo(projectRel); + } } catch (final Exception e) { logger.warn("Failed to convert HiveScan to HiveDrillNativeParquetScan", e); } diff --git a/contrib/storage-hive/core/src/test/java/org/apache/drill/exec/hive/TestHiveStorage.java b/contrib/storage-hive/core/src/test/java/org/apache/drill/exec/hive/TestHiveStorage.java index c2e367da67c..55de2d7363b 100644 --- a/contrib/storage-hive/core/src/test/java/org/apache/drill/exec/hive/TestHiveStorage.java +++ b/contrib/storage-hive/core/src/test/java/org/apache/drill/exec/hive/TestHiveStorage.java @@ -44,8 +44,15 @@ public void testNativeScanWhenNoColumnIsRead() throws Exception { try { test(String.format("alter session set `%s` = true", ExecConstants.HIVE_OPTIMIZE_SCAN_WITH_NATIVE_READERS)); - String query = "SELECT count(*) FROM hive.readtest_parquet"; + String query = "SELECT count(*) as col FROM hive.countStar_Parquet"; testPhysicalPlan(query, "hive-drill-native-parquet-scan"); + + testBuilder() + .sqlQuery(query) + .unOrdered() + .baselineColumns("col") + .baselineValues(200l) + .go(); } finally { test(String.format("alter session set `%s` = %s", ExecConstants.HIVE_OPTIMIZE_SCAN_WITH_NATIVE_READERS, diff --git a/contrib/storage-hive/core/src/test/java/org/apache/drill/exec/hive/TestInfoSchemaOnHiveStorage.java b/contrib/storage-hive/core/src/test/java/org/apache/drill/exec/hive/TestInfoSchemaOnHiveStorage.java index 9352ce08133..f9fc0acc865 100644 --- a/contrib/storage-hive/core/src/test/java/org/apache/drill/exec/hive/TestInfoSchemaOnHiveStorage.java +++ b/contrib/storage-hive/core/src/test/java/org/apache/drill/exec/hive/TestInfoSchemaOnHiveStorage.java @@ -41,6 +41,7 @@ public void showTablesFromDb() throws Exception{ .baselineValues("hive.default", "kv") .baselineValues("hive.default", "kv_parquet") .baselineValues("hive.default", "kv_sh") + .baselineValues("hive.default", "countstar_parquet") .go(); testBuilder() diff --git a/contrib/storage-hive/core/src/test/java/org/apache/drill/exec/store/hive/HiveTestDataGenerator.java b/contrib/storage-hive/core/src/test/java/org/apache/drill/exec/store/hive/HiveTestDataGenerator.java index f42e8d7981b..b38290b5b19 100644 --- a/contrib/storage-hive/core/src/test/java/org/apache/drill/exec/store/hive/HiveTestDataGenerator.java +++ b/contrib/storage-hive/core/src/test/java/org/apache/drill/exec/store/hive/HiveTestDataGenerator.java @@ -440,6 +440,22 @@ private void generateTestData() throws Exception { executeQuery(hiveDriver, "INSERT INTO TABLE kv_parquet PARTITION(part1) SELECT key, value, key FROM default.kv"); executeQuery(hiveDriver, "ALTER TABLE kv_parquet ADD COLUMNS (newcol string)"); + executeQuery(hiveDriver, + "CREATE TABLE countStar_Parquet (int_field INT) STORED AS parquet"); + + final int numOfRows = 200; + final StringBuffer sb = new StringBuffer(); + sb.append("VALUES "); + for(int i = 0; i < numOfRows; ++i) { + if(i != 0) { + sb.append(","); + } + sb.append("(").append(i).append(")"); + } + + executeQuery(hiveDriver, "INSERT INTO TABLE countStar_Parquet \n" + + sb.toString()); + // Create a StorageHandler based table (DRILL-3739) executeQuery(hiveDriver, "CREATE TABLE kv_sh(key INT, value STRING) STORED BY " + "'org.apache.hadoop.hive.ql.metadata.DefaultStorageHandler'");