blob: 3dc09c9d712cf602dff4e6d80f75a1926b90051a [file] [log] [blame]
/*
* 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.drill.exec.hive.complex_types;
import java.math.BigDecimal;
import java.util.stream.IntStream;
import org.apache.drill.categories.HiveStorageTest;
import org.apache.drill.categories.SlowTest;
import org.apache.drill.exec.ExecConstants;
import org.apache.drill.exec.expr.fn.impl.DateUtility;
import org.apache.drill.exec.hive.HiveTestFixture;
import org.apache.drill.exec.hive.HiveTestUtilities;
import org.apache.drill.test.ClusterFixture;
import org.apache.drill.test.ClusterTest;
import org.apache.hadoop.hive.ql.Driver;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import static org.apache.drill.test.TestBuilder.listOf;
import static org.apache.drill.test.TestBuilder.mapOf;
import static org.apache.drill.test.TestBuilder.mapOfObject;
@Category({SlowTest.class, HiveStorageTest.class})
public class TestHiveUnions extends ClusterTest {
private static HiveTestFixture hiveTestFixture;
@BeforeClass
public static void setUp() throws Exception {
startCluster(ClusterFixture.builder(dirTestWatcher)
.sessionOption(ExecConstants.HIVE_OPTIMIZE_PARQUET_SCAN_WITH_NATIVE_READER, true)
);
hiveTestFixture = HiveTestFixture.builder(dirTestWatcher).build();
hiveTestFixture.getDriverManager().runWithinSession(TestHiveUnions::generateData);
hiveTestFixture.getPluginManager().addHivePluginTo(cluster.drillbit());
}
@AfterClass
public static void tearDown() throws Exception {
if (hiveTestFixture != null) {
hiveTestFixture.getPluginManager().removeHivePluginFrom(cluster.drillbit());
}
}
private static void generateData(Driver d) {
HiveTestUtilities.executeQuery(d, "CREATE TABLE dummy(d INT) STORED AS TEXTFILE");
HiveTestUtilities.executeQuery(d, "INSERT INTO TABLE dummy VALUES (1)");
String unionDdl = "CREATE TABLE union_tbl(" +
"tag INT, " +
"ut UNIONTYPE<INT, DOUBLE, ARRAY<STRING>, STRUCT<a:INT,b:STRING>, DATE, BOOLEAN," +
"DECIMAL(9,3), TIMESTAMP, BIGINT, FLOAT, MAP<INT, BOOLEAN>, ARRAY<INT>>) " +
"ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' COLLECTION ITEMS TERMINATED BY '&' " +
"MAP KEYS TERMINATED BY '#' LINES TERMINATED BY '\\n' STORED AS TEXTFILE";
HiveTestUtilities.executeQuery(d, unionDdl);
String insert = "INSERT INTO TABLE union_tbl " +
"SELECT %1$d, " +
"create_union(%1$d, " +
"1, " +
"CAST(17.55 AS DOUBLE), " +
"array('x','yy','zzz'), " +
"named_struct('a',1,'b','x'), " +
"CAST('2019-09-09' AS DATE), " +
"true, " +
"CAST(12356.123 AS DECIMAL(9,3)), " +
"CAST('2018-10-21 04:51:36' AS TIMESTAMP), " +
"CAST(9223372036854775807 AS BIGINT), " +
"CAST(-32.058 AS FLOAT), " +
"map(1,true,2,false,3,false,4,true), " +
"array(7,-9,2,-5,22)" +
")" +
" FROM dummy";
IntStream.of(1, 5, 0, 2, 4, 3, 11, 8, 7, 9, 10, 6)
.forEach(v -> HiveTestUtilities.executeQuery(d, String.format(insert, v)));
}
@Test
public void checkUnion() throws Exception {
testBuilder()
.sqlQuery("SELECT tag, ut FROM hive.union_tbl")
.unOrdered()
.baselineColumns("tag", "ut")
.baselineValues(1, 17.55)
.baselineValues(5, true)
.baselineValues(0, 1)
.baselineValues(2, listOf("x", "yy", "zzz"))
.baselineValues(4, DateUtility.parseLocalDate("2019-09-09"))
.baselineValues(3, mapOf("a", 1, "b", "x"))
.baselineValues(11, listOf(7, -9, 2, -5, 22))
.baselineValues(8, 9223372036854775807L)
.baselineValues(7, DateUtility.parseBest("2018-10-21 04:51:36"))
.baselineValues(9, -32.058f)
.baselineValues(10, mapOfObject(1, true, 2, false, 3, false, 4, true))
.baselineValues(6, new BigDecimal("12356.123"))
.go();
}
}