Author: cws
Date: Fri Dec 2 08:14:10 2011
New Revision: 1209384
URL: http://svn.apache.org/viewvc?rev=1209384&view=rev
Log:
HIVE-2523. Add a new builtins subproject (John Sichi via cws)
Added:
hive/trunk/builtins/
hive/trunk/builtins/build-plugin.xml
hive/trunk/builtins/build.xml
hive/trunk/builtins/ivy.xml
hive/trunk/builtins/src/
hive/trunk/builtins/src/org/
hive/trunk/builtins/src/org/apache/
hive/trunk/builtins/src/org/apache/hive/
hive/trunk/builtins/src/org/apache/hive/builtins/
hive/trunk/builtins/src/org/apache/hive/builtins/BuiltinUtils.java
hive/trunk/builtins/src/org/apache/hive/builtins/UDAFUnionMap.java
hive/trunk/builtins/test/
hive/trunk/builtins/test/cleanup.sql
hive/trunk/builtins/test/iris.txt
hive/trunk/builtins/test/onerow.txt
hive/trunk/builtins/test/setup.sql
Modified:
hive/trunk/bin/hive
hive/trunk/build.xml
hive/trunk/eclipse-templates/.classpath
hive/trunk/pdk/scripts/build-plugin.xml
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionTask.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java
hive/trunk/ql/src/test/results/clientpositive/show_functions.q.out
Modified: hive/trunk/bin/hive
URL:
http://svn.apache.org/viewvc/hive/trunk/bin/hive?rev=1209384&r1=1209383&r2=1209384&view=diff
==============================================================================
--- hive/trunk/bin/hive (original)
+++ hive/trunk/bin/hive Fri Dec 2 08:14:10 2011
@@ -74,6 +74,11 @@ if [ ! -f ${HIVE_LIB}/hive-exec-*.jar ];
exit 1;
fi
+if [ ! -f ${HIVE_LIB}/hive-builtins-*.jar ]; then
+ echo "Missing Hive Builtins Jar: ${HIVE_LIB}/hive-builtins-*.jar"
+ exit 1;
+fi
+
if [ ! -f ${HIVE_LIB}/hive-metastore-*.jar ]; then
echo "Missing Hive MetaStore Jar"
exit 2;
Modified: hive/trunk/build.xml
URL:
http://svn.apache.org/viewvc/hive/trunk/build.xml?rev=1209384&r1=1209383&r2=1209384&view=diff
==============================================================================
--- hive/trunk/build.xml (original)
+++ hive/trunk/build.xml Fri Dec 2 08:14:10 2011
@@ -139,7 +139,7 @@
<subant target="@{target}">
<property name="build.dir.hive" location="${build.dir.hive}"/>
<property name="is-offline" value="${is-offline}"/>
- <filelist dir="."
files="ant/build.xml,shims/build.xml,common/build.xml,serde/build.xml,metastore/build.xml,ql/build.xml,contrib/build.xml,service/build.xml,cli/build.xml,jdbc/build.xml,hwi/build.xml,hbase-handler/build.xml,ant/build.xml,pdk/build.xml"/>
+ <filelist dir="."
files="ant/build.xml,shims/build.xml,common/build.xml,serde/build.xml,metastore/build.xml,ql/build.xml,contrib/build.xml,service/build.xml,cli/build.xml,jdbc/build.xml,hwi/build.xml,hbase-handler/build.xml,ant/build.xml,pdk/build.xml,builtins/build.xml"/>
</subant>
</sequential>
</macrodef>
@@ -150,7 +150,7 @@
<subant target="@{target}">
<property name="build.dir.hive" location="${build.dir.hive}"/>
<property name="is-offline" value="${is-offline}"/>
- <filelist dir="."
files="shims/build.xml,common/build.xml,serde/build.xml,metastore/build.xml,ql/build.xml,contrib/build.xml,service/build.xml,cli/build.xml,jdbc/build.xml,hwi/build.xml,hbase-handler/build.xml,pdk/build.xml"/>
+ <filelist dir="."
files="shims/build.xml,common/build.xml,serde/build.xml,metastore/build.xml,ql/build.xml,contrib/build.xml,service/build.xml,cli/build.xml,jdbc/build.xml,hwi/build.xml,hbase-handler/build.xml,pdk/build.xml,builtins/build.xml"/>
</subant>
</sequential>
</macrodef>
@@ -519,6 +519,13 @@
<symlink overwrite="true" link="${target.lib.dir}/libthrift.jar"
resource="libthrift-${libthrift.version}.jar"/>
<symlink overwrite="true" link="${target.lib.dir}/libfb303.jar"
resource="libfb303-${libfb303.version}.jar"/>
<symlink overwrite="true" link="${target.lib.dir}/hive_contrib.jar"
resource="hive-contrib-${version}.jar"/>
+ <!-- special case because builtins compilation depends on packaging
+ up everything else first -->
+ <ant antfile="${hive.root}/builtins/build.xml" target="package"
+ inheritAll="false" />
+ <copy todir="${target.lib.dir}" preservelastmodified="true" flatten="true">
+ <fileset file="${build.dir.hive}/builtins/hive-builtins-${version}.jar"/>
+ </copy>
</target>
@@ -665,6 +672,7 @@
<packageset dir="${build.dir.hive}/ql/gen/antlr/gen-java"/>
<packageset dir="shims/src/common/java"/>
<packageset dir="pdk/src/java"/>
+ <packageset dir="builtins/src"/>
<link href="${javadoc.link.java}"/>
@@ -902,6 +910,8 @@
todir="${mvn.jar.dir}" />
<copy file="${build.dir.hive}/pdk/hive-pdk-${version}.jar"
todir="${mvn.jar.dir}" />
+ <copy file="${build.dir.hive}/pdk/hive-builtins-${version}.jar"
+ todir="${mvn.jar.dir}" />
<!-- copy over maven pom files created using the make-pom target and
rename to maven convention -->
<copy file="${build.dir.hive}/anttasks/pom.xml"
@@ -930,6 +940,8 @@
tofile="${mvn.pom.dir}/hive-shims-${version}.pom" />
<copy file="${build.dir.hive}/pdk/pom.xml"
tofile="${mvn.pom.dir}/hive-pdk-${version}.pom" />
+ <copy file="${build.dir.hive}/builtins/pom.xml"
+ tofile="${mvn.pom.dir}/hive-builtins-${version}.pom" />
<!-- copy over licence -->
<copy file="${hive.root}/LICENSE" todir="${mvn.license.dir}" />
@@ -1019,6 +1031,9 @@
<param name="hive.project" value="pdk" />
</antcall>
<antcall target="maven-publish-artifact">
+ <param name="hive.project" value="builtins" />
+ </antcall>
+ <antcall target="maven-publish-artifact">
<param name="hive.project" value="jdbc" />
</antcall>
<antcall target="maven-publish-artifact">
@@ -1138,6 +1153,14 @@
output.file="${mvn.pom.dir}/hive-pdk-${version}.pom.asc"
gpg.passphrase="${gpg.passphrase}"/>
<sign-artifact
+ input.file="${mvn.jar.dir}/hive-builtins-${version}.jar"
+ output.file="${mvn.jar.dir}/hive-builtins-${version}.jar.asc"
+ gpg.passphrase="${gpg.passphrase}"/>
+ <sign-artifact
+ input.file="${mvn.pom.dir}/hive-builtins-${version}.pom"
+ output.file="${mvn.pom.dir}/hive-builtins-${version}.pom.asc"
+ gpg.passphrase="${gpg.passphrase}"/>
+ <sign-artifact
input.file="${mvn.jar.dir}/hive-serde-${version}.jar"
output.file="${mvn.jar.dir}/hive-serde-${version}.jar.asc"
gpg.passphrase="${gpg.passphrase}"/>
Added: hive/trunk/builtins/build-plugin.xml
URL:
http://svn.apache.org/viewvc/hive/trunk/builtins/build-plugin.xml?rev=1209384&view=auto
==============================================================================
--- hive/trunk/builtins/build-plugin.xml (added)
+++ hive/trunk/builtins/build-plugin.xml Fri Dec 2 08:14:10 2011
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ 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.
+-->
+
+<project name="builtins-plugin" default="jar">
+ <dirname property="builtins.dir" file="${ant.file.builtins}"/>
+ <property name="hive.root" location="${builtins.dir}/.."/>
+ <property file="${hive.root}/build.properties"/>
+ <property name="plugin.libname" value="hive-builtins"/>
+ <property name="plugin.title" value="Hive Builtin Function Library"/>
+ <property name="plugin.version" value="${version}"/>
+ <property name="plugin.vendor" value="Apache Software Foundation"/>
+ <property name="function.sql.prefix" value=""/>
+ <property name="build.dir" location="${hive.root}/build/builtins"/>
+ <property name="install.dir" location="${hive.root}/build/dist"/>
+ <import file="${hive.root}/pdk/scripts/build-plugin.xml"/>
+</project>
Added: hive/trunk/builtins/build.xml
URL:
http://svn.apache.org/viewvc/hive/trunk/builtins/build.xml?rev=1209384&view=auto
==============================================================================
--- hive/trunk/builtins/build.xml (added)
+++ hive/trunk/builtins/build.xml Fri Dec 2 08:14:10 2011
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ 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.
+-->
+
+<project name="builtins" default="jar">
+
+ <property name="src.dir" location="${basedir}/src"/>
+ <import file="../build-common.xml"/>
+
+ <target name="compile" depends="init, setup">
+ <echo message="Project: ${ant.project.name}"/>
+ <!-- defer compilation until package phase -->
+ </target>
+
+ <target name="jar" depends="init">
+ <echo message="Project: ${ant.project.name}"/>
+ <!-- defer compilation until package phase -->
+ </target>
+
+ <target name="package">
+ <echo message="Project: ${ant.project.name}"/>
+ <ant antfile="build-plugin.xml" target="package" inheritAll="false">
+ <property name="hive.install.dir" value="${build.dir.hive}/dist"/>
+ <property name="hadoop.home" value="${hadoop.root}"/>
+ </ant>
+ </target>
+
+ <target name="test" unless="testcase">
+ <echo message="Project: ${ant.project.name}"/>
+ <ant antfile="build-plugin.xml" target="test" inheritAll="false">
+ <property name="hive.install.dir" value="${build.dir.hive}/dist"/>
+ <property name="hadoop.home" value="${hadoop.root}"/>
+ </ant>
+ </target>
+
+ <target name="clean">
+ <echo message="Project: ${ant.project.name}"/>
+ <ant antfile="build-plugin.xml" target="clean" inheritAll="false">
+ <property name="hive.install.dir" value="${build.dir.hive}/dist"/>
+ <property name="hadoop.home" value="${hadoop.root}"/>
+ </ant>
+ </target>
+</project>
Added: hive/trunk/builtins/ivy.xml
URL:
http://svn.apache.org/viewvc/hive/trunk/builtins/ivy.xml?rev=1209384&view=auto
==============================================================================
--- hive/trunk/builtins/ivy.xml (added)
+++ hive/trunk/builtins/ivy.xml Fri Dec 2 08:14:10 2011
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+-->
+<ivy-module version="2.0">
+ <info organisation="${hive.ivy.org}" module="hive-builtins"
revision="${version}">
+ <license name="The Apache Software License, Version 2.0"
url="http://www.apache.org/licenses/LICENSE-2.0.txt" />
+ <description homepage="http://hive.apache.org">
+ The Apache Hive (TM) data warehouse software facilitates querying and
managing large datasets residing in distributed storage.
+ https://cwiki.apache.org/confluence/display/Hive/Home
+ </description>
+ </info>
+ <dependencies>
+ </dependencies>
+</ivy-module>
Added: hive/trunk/builtins/src/org/apache/hive/builtins/BuiltinUtils.java
URL:
http://svn.apache.org/viewvc/hive/trunk/builtins/src/org/apache/hive/builtins/BuiltinUtils.java?rev=1209384&view=auto
==============================================================================
--- hive/trunk/builtins/src/org/apache/hive/builtins/BuiltinUtils.java (added)
+++ hive/trunk/builtins/src/org/apache/hive/builtins/BuiltinUtils.java Fri Dec
2 08:14:10 2011
@@ -0,0 +1,28 @@
+/**
+ * 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.hive.builtins;
+
+/**
+ * Utility method class supporting builtin functions. We also
+ * use this class as a well-known name for loading metadata from
+ * the builtins jar.
+ */
+public abstract class BuiltinUtils
+{
+}
Added: hive/trunk/builtins/src/org/apache/hive/builtins/UDAFUnionMap.java
URL:
http://svn.apache.org/viewvc/hive/trunk/builtins/src/org/apache/hive/builtins/UDAFUnionMap.java?rev=1209384&view=auto
==============================================================================
--- hive/trunk/builtins/src/org/apache/hive/builtins/UDAFUnionMap.java (added)
+++ hive/trunk/builtins/src/org/apache/hive/builtins/UDAFUnionMap.java Fri Dec
2 08:14:10 2011
@@ -0,0 +1,127 @@
+/**
+ * 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.hive.builtins;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.hive.pdk.HivePdkUnitTest;
+import org.apache.hive.pdk.HivePdkUnitTests;
+
+import org.apache.hadoop.hive.ql.exec.Description;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.parse.SemanticException;
+import org.apache.hadoop.hive.ql.udf.generic.AbstractGenericUDAFResolver;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFEvaluator;
+import
org.apache.hadoop.hive.ql.udf.generic.GenericUDAFEvaluator.AggregationBuffer;
+import org.apache.hadoop.hive.serde2.objectinspector.MapObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
+import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
+
+/**
+ * Aggregate all maps into a single map. If there are multiple values for
+ * the same key, result can contain any of those values.
+ * Because the mappers must keep all of the data in memory, if your data is
+ * non-trivially large you should set hive.map.aggr=false to ensure that
+ * UNION_MAP is only executed in the reduce phase.
+ */
+@HivePdkUnitTests(
+ setup = "",
+ cleanup = "",
+ cases = {
+ @HivePdkUnitTest(
+ query = "SELECT size(UNION_MAP(MAP(sepal_width, sepal_length))) "
+ +"FROM iris",
+ result = "23")
+ })
+@Description(
+ name = "union_map",
+ value = "_FUNC_(col) - aggregate given maps into a single map",
+ extended = "Aggregate maps, returns as a HashMap.")
+public class UDAFUnionMap extends AbstractGenericUDAFResolver {
+ @Override
+ public GenericUDAFEvaluator getEvaluator(TypeInfo[] parameters) throws
SemanticException {
+
+ // Next two validation calls are dependent on HIVE-2524, so
+ // leave them commented out for now.
+ //
+ // new LengthEquals(1).check(parameters.length);
+ // new IsMap().check(parameters[0], 0);
+
+ return new Evaluator();
+ }
+
+ public static class State implements AggregationBuffer {
+ HashMap<Object, Object> map = new HashMap<Object, Object>();
+ }
+
+ public static class Evaluator extends GenericUDAFEvaluator {
+ ObjectInspector inputOI;
+ MapObjectInspector internalMergeOI;
+
+ @Override
+ public ObjectInspector init(Mode m, ObjectInspector[] parameters) throws
HiveException {
+ super.init(m, parameters);
+ if (m == Mode.COMPLETE || m == Mode.PARTIAL1) {
+ inputOI = (MapObjectInspector) parameters[0];
+ } else {
+ internalMergeOI = (MapObjectInspector) parameters[0];
+ }
+ return ObjectInspectorUtils.getStandardObjectInspector(parameters[0]);
+ }
+
+ @Override
+ public AggregationBuffer getNewAggregationBuffer() throws HiveException {
+ return new State();
+ }
+
+ @Override
+ public void iterate(AggregationBuffer agg, Object[] input) throws
HiveException {
+ if (input[0] != null) {
+ State state = (State) agg;
+
state.map.putAll((Map<?,?>)ObjectInspectorUtils.copyToStandardObject(input[0],
inputOI));
+ }
+ }
+
+ @Override
+ public void merge(AggregationBuffer agg, Object partial) throws
HiveException {
+ if (partial != null) {
+ State state = (State) agg;
+ Map<?,?> pset =
(Map<?,?>)ObjectInspectorUtils.copyToStandardObject(partial, internalMergeOI);
+ state.map.putAll(pset);
+ }
+ }
+
+ @Override
+ public void reset(AggregationBuffer agg) throws HiveException {
+ ((State) agg).map.clear();
+ }
+
+ @Override
+ public Object terminate(AggregationBuffer agg) throws HiveException {
+ return ((State) agg).map;
+ }
+
+ @Override
+ public Object terminatePartial(AggregationBuffer agg) throws HiveException
{
+ return ((State) agg).map;
+ }
+ }
+}
Added: hive/trunk/builtins/test/cleanup.sql
URL:
http://svn.apache.org/viewvc/hive/trunk/builtins/test/cleanup.sql?rev=1209384&view=auto
==============================================================================
--- hive/trunk/builtins/test/cleanup.sql (added)
+++ hive/trunk/builtins/test/cleanup.sql Fri Dec 2 08:14:10 2011
@@ -0,0 +1,2 @@
+drop table if exists onerow;
+drop table if exists iris;
Added: hive/trunk/builtins/test/iris.txt
URL:
http://svn.apache.org/viewvc/hive/trunk/builtins/test/iris.txt?rev=1209384&view=auto
==============================================================================
--- hive/trunk/builtins/test/iris.txt (added)
+++ hive/trunk/builtins/test/iris.txt Fri Dec 2 08:14:10 2011
@@ -0,0 +1,150 @@
+6 2.9 4.5 1.5 versicolor
+6.9 3.1 5.1 2.3 virginica
+5.4 3.4 1.5 0.4 setosa
+5.5 3.5 1.3 0.2 setosa
+4.6 3.1 1.5 0.2 setosa
+4.4 2.9 1.4 0.2 setosa
+5.9 3 4.2 1.5 versicolor
+5.1 3.8 1.6 0.2 setosa
+5 3.6 1.4 0.2 setosa
+6.7 3.1 5.6 2.4 virginica
+4.9 3.6 1.4 0.1 setosa
+4.9 2.5 4.5 1.7 virginica
+5.8 2.8 5.1 2.4 virginica
+4.5 2.3 1.3 0.3 setosa
+6.7 3 5.2 2.3 virginica
+6 3 4.8 1.8 virginica
+6.4 3.2 4.5 1.5 versicolor
+7.7 3.8 6.7 2.2 virginica
+5.7 2.6 3.5 1 versicolor
+5.7 2.9 4.2 1.3 versicolor
+5.4 3.9 1.7 0.4 setosa
+5 3.5 1.3 0.3 setosa
+6 2.2 5 1.5 virginica
+6.6 2.9 4.6 1.3 versicolor
+5.9 3 5.1 1.8 virginica
+4.7 3.2 1.6 0.2 setosa
+5 3.4 1.5 0.2 setosa
+6.9 3.2 5.7 2.3 virginica
+6.5 3 5.8 2.2 virginica
+5.5 4.2 1.4 0.2 setosa
+7.1 3 5.9 2.1 virginica
+6.2 2.9 4.3 1.3 versicolor
+5.7 4.4 1.5 0.4 setosa
+4.9 2.4 3.3 1 versicolor
+5.4 3.9 1.3 0.4 setosa
+6.4 2.8 5.6 2.1 virginica
+6.9 3.1 4.9 1.5 versicolor
+5.9 3.2 4.8 1.8 versicolor
+6.1 3 4.9 1.8 virginica
+5.6 3 4.5 1.5 versicolor
+5.3 3.7 1.5 0.2 setosa
+6.4 2.9 4.3 1.3 versicolor
+6.6 3 4.4 1.4 versicolor
+6.4 3.1 5.5 1.8 virginica
+6.3 2.5 4.9 1.5 versicolor
+6.7 3.3 5.7 2.5 virginica
+6.4 2.7 5.3 1.9 virginica
+6.5 3 5.5 1.8 virginica
+6.7 3.1 4.4 1.4 versicolor
+4.9 3 1.4 0.2 setosa
+6.2 2.8 4.8 1.8 virginica
+7.6 3 6.6 2.1 virginica
+5.2 3.5 1.5 0.2 setosa
+7.7 2.6 6.9 2.3 virginica
+6.5 3.2 5.1 2 virginica
+5.8 2.6 4 1.2 versicolor
+6.3 2.9 5.6 1.8 virginica
+5.8 4 1.2 0.2 setosa
+6.5 2.8 4.6 1.5 versicolor
+5 3.2 1.2 0.2 setosa
+7.4 2.8 6.1 1.9 virginica
+7 3.2 4.7 1.4 versicolor
+4.8 3.4 1.6 0.2 setosa
+6.4 2.8 5.6 2.2 virginica
+5.4 3.7 1.5 0.2 setosa
+5.7 3.8 1.7 0.3 setosa
+5.2 2.7 3.9 1.4 versicolor
+6.3 3.3 6 2.5 virginica
+5.1 2.5 3 1.1 versicolor
+7.7 2.8 6.7 2 virginica
+5.5 2.4 3.7 1 versicolor
+7.3 2.9 6.3 1.8 virginica
+4.3 3 1.1 0.1 setosa
+5.6 2.7 4.2 1.3 versicolor
+7.9 3.8 6.4 2 virginica
+5.6 2.8 4.9 2 virginica
+5 3 1.6 0.2 setosa
+6.1 3 4.6 1.4 versicolor
+5.1 3.5 1.4 0.2 setosa
+5.1 3.4 1.5 0.2 setosa
+4.8 3.4 1.9 0.2 setosa
+4.6 3.4 1.4 0.3 setosa
+6.5 3 5.2 2 virginica
+5.1 3.8 1.9 0.4 setosa
+5.6 2.9 3.6 1.3 versicolor
+6.7 3 5 1.7 versicolor
+7.2 3.6 6.1 2.5 virginica
+4.9 3.1 1.5 0.1 setosa
+6.2 3.4 5.4 2.3 virginica
+5.8 2.7 5.1 1.9 virginica
+5.6 2.5 3.9 1.1 versicolor
+6.3 2.5 5 1.9 virginica
+4.6 3.2 1.4 0.2 setosa
+5.8 2.7 5.1 1.9 virginica
+5.5 2.3 4 1.3 versicolor
+6.7 3.3 5.7 2.1 virginica
+6 2.2 4 1 versicolor
+5.1 3.7 1.5 0.4 setosa
+5 3.5 1.6 0.6 setosa
+5.8 2.7 4.1 1 versicolor
+5.7 2.8 4.1 1.3 versicolor
+6 3.4 4.5 1.6 versicolor
+6.1 2.9 4.7 1.4 versicolor
+5.2 3.4 1.4 0.2 setosa
+5.6 3 4.1 1.3 versicolor
+6.8 2.8 4.8 1.4 versicolor
+5.8 2.7 3.9 1.2 versicolor
+4.8 3.1 1.6 0.2 setosa
+5.1 3.5 1.4 0.3 setosa
+5 3.3 1.4 0.2 setosa
+7.2 3.2 6 1.8 virginica
+6.7 3.1 4.7 1.5 versicolor
+6.8 3.2 5.9 2.3 virginica
+4.6 3.6 1 0.2 setosa
+5.4 3 4.5 1.5 versicolor
+6.4 3.2 5.3 2.3 virginica
+4.8 3 1.4 0.1 setosa
+5.5 2.5 4 1.3 versicolor
+6.9 3.1 5.4 2.1 virginica
+6.8 3 5.5 2.1 virginica
+4.8 3 1.4 0.3 setosa
+6.3 2.7 4.9 1.8 virginica
+6 2.7 5.1 1.6 versicolor
+6.1 2.6 5.6 1.4 virginica
+7.2 3 5.8 1.6 virginica
+5 2.3 3.3 1 versicolor
+6.3 3.3 4.7 1.6 versicolor
+6.3 2.8 5.1 1.5 virginica
+4.7 3.2 1.3 0.2 setosa
+6.3 3.4 5.6 2.4 virginica
+5.7 2.8 4.5 1.3 versicolor
+5.7 3 4.2 1.2 versicolor
+4.9 3.1 1.5 0.2 setosa
+5 2 3.5 1 versicolor
+7.7 3 6.1 2.3 virginica
+5.7 2.5 5 2 virginica
+5.5 2.4 3.8 1.1 versicolor
+5.1 3.3 1.7 0.5 setosa
+6.3 2.3 4.4 1.3 versicolor
+4.4 3 1.3 0.2 setosa
+6.1 2.8 4 1.3 versicolor
+6.1 2.8 4.7 1.2 versicolor
+5.5 2.6 4.4 1.2 versicolor
+5.1 3.8 1.5 0.3 setosa
+4.4 3.2 1.3 0.2 setosa
+5 3.4 1.6 0.4 setosa
+6.7 2.5 5.8 1.8 virginica
+5.2 4.1 1.5 0.1 setosa
+6.2 2.2 4.5 1.5 versicolor
+5.4 3.4 1.7 0.2 setosa
Added: hive/trunk/builtins/test/onerow.txt
URL:
http://svn.apache.org/viewvc/hive/trunk/builtins/test/onerow.txt?rev=1209384&view=auto
==============================================================================
--- hive/trunk/builtins/test/onerow.txt (added)
+++ hive/trunk/builtins/test/onerow.txt Fri Dec 2 08:14:10 2011
@@ -0,0 +1 @@
+plugh
Added: hive/trunk/builtins/test/setup.sql
URL:
http://svn.apache.org/viewvc/hive/trunk/builtins/test/setup.sql?rev=1209384&view=auto
==============================================================================
--- hive/trunk/builtins/test/setup.sql (added)
+++ hive/trunk/builtins/test/setup.sql Fri Dec 2 08:14:10 2011
@@ -0,0 +1,10 @@
+create table onerow(s string);
+load data local inpath '${env:HIVE_PLUGIN_ROOT_DIR}/test/onerow.txt'
+overwrite into table onerow;
+create table iris(
+sepal_length string, sepal_width string,
+petal_length string, petal_width string,
+species string)
+row format delimited fields terminated by '\t' stored as textfile;
+load data local inpath '${env:HIVE_PLUGIN_ROOT_DIR}/test/iris.txt'
+overwrite into table iris;
Modified: hive/trunk/eclipse-templates/.classpath
URL:
http://svn.apache.org/viewvc/hive/trunk/eclipse-templates/.classpath?rev=1209384&r1=1209383&r2=1209384&view=diff
==============================================================================
--- hive/trunk/eclipse-templates/.classpath (original)
+++ hive/trunk/eclipse-templates/.classpath Fri Dec 2 08:14:10 2011
@@ -69,6 +69,7 @@
<classpathentry excluding="queries/|results/|templates/" kind="src"
path="hbase-handler/src/test"/>
<classpathentry kind="src" path="pdk/src/java"/>
<classpathentry kind="src" path="pdk/test-plugin/src"/>
+ <classpathentry kind="src" path="builtins/src/java"/>
<classpathentry kind="src" path="cli/src/test"/>
<classpathentry kind="output" path="build/eclipse-classes"/>
</classpath>
Modified: hive/trunk/pdk/scripts/build-plugin.xml
URL:
http://svn.apache.org/viewvc/hive/trunk/pdk/scripts/build-plugin.xml?rev=1209384&r1=1209383&r2=1209384&view=diff
==============================================================================
--- hive/trunk/pdk/scripts/build-plugin.xml (original)
+++ hive/trunk/pdk/scripts/build-plugin.xml Fri Dec 2 08:14:10 2011
@@ -59,10 +59,14 @@
</javac>
</target>
- <target name="jar" depends="compile">
+ <target name="jar" depends="extract-functions">
<jar
jarfile="${build.dir}/${plugin.jar.basename}"
basedir="${build.classes}">
+ <metainf dir="${build.metadata}">
+ <include name="class-info.xml"/>
+ <include name="class-registration.sql"/>
+ </metainf>
<manifest>
<attribute name="Implementation-Title" value="${plugin.title}"/>
<attribute name="Implementation-Version" value="${plugin.version}"/>
@@ -111,7 +115,7 @@
<delete quiet="true" dir="${build.dir}"/>
</target>
- <target name="package" depends="jar,extract-functions"/>
+ <target name="package" depends="jar"/>
<target name="test" depends="package" unless="testcase">
<junit fork="true" printsummary="on" haltonfailure="true"
Modified:
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
URL:
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java?rev=1209384&r1=1209383&r2=1209384&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
(original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
Fri Dec 2 08:14:10 2011
@@ -18,7 +18,9 @@
package org.apache.hadoop.hive.ql.exec;
+import java.io.InputStream;
import java.lang.reflect.Method;
+import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@@ -30,6 +32,9 @@ import java.util.TreeSet;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.hive.ql.metadata.HiveException;
@@ -212,8 +217,13 @@ import org.apache.hadoop.hive.serde2.typ
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils;
+import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.ReflectionUtils;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
/**
* FunctionRegistry.
@@ -1130,6 +1140,82 @@ public final class FunctionRegistry {
return UDFOPPositive.class == udfClass;
}
+ /**
+ * Registers the appropriate kind of temporary function based on a class's
+ * type.
+ *
+ * @param functionName name under which to register function
+ *
+ * @param udfClass class implementing UD[A|T]F
+ *
+ * @return true if udfClass's type was recognized (so registration
+ * succeeded); false otherwise
+ */
+ public static boolean registerTemporaryFunction(
+ String functionName, Class<?> udfClass) {
+
+ if (UDF.class.isAssignableFrom(udfClass)) {
+ FunctionRegistry.registerTemporaryUDF(
+ functionName, (Class<? extends UDF>) udfClass, false);
+ } else if (GenericUDF.class.isAssignableFrom(udfClass)) {
+ FunctionRegistry.registerTemporaryGenericUDF(
+ functionName, (Class<? extends GenericUDF>) udfClass);
+ } else if (GenericUDTF.class.isAssignableFrom(udfClass)) {
+ FunctionRegistry.registerTemporaryGenericUDTF(
+ functionName, (Class<? extends GenericUDTF>) udfClass);
+ } else if (UDAF.class.isAssignableFrom(udfClass)) {
+ FunctionRegistry.registerTemporaryUDAF(
+ functionName, (Class<? extends UDAF>) udfClass);
+ } else if (GenericUDAFResolver.class.isAssignableFrom(udfClass)) {
+ FunctionRegistry.registerTemporaryGenericUDAF(
+ functionName, (GenericUDAFResolver)
+ ReflectionUtils.newInstance(udfClass, null));
+ } else {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Registers Hive functions from a plugin jar, using metadata from
+ * the jar's META-INF/class-info.xml.
+ *
+ * @param jarLocation URL for reading jar file
+ *
+ * @param classLoader classloader to use for loading function classes
+ */
+ public static void registerFunctionsFromPluginJar(
+ URL jarLocation,
+ ClassLoader classLoader) throws Exception {
+
+ URL url = new URL("jar:" + jarLocation + "!/META-INF/class-info.xml");
+ InputStream inputStream = null;
+ try {
+ inputStream = url.openStream();
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ Document doc = docBuilder.parse(inputStream);
+ Element root = doc.getDocumentElement();
+ if (!root.getTagName().equals("ClassList")) {
+ return;
+ }
+ NodeList children = root.getElementsByTagName("Class");
+ for (int i = 0; i < children.getLength(); ++i) {
+ Element child = (Element) children.item(i);
+ String javaName = child.getAttribute("javaname");
+ String sqlName = child.getAttribute("sqlname");
+ Class<?> udfClass = Class.forName(javaName, true, classLoader);
+ boolean registered = registerTemporaryFunction(sqlName, udfClass);
+ if (!registered) {
+ throw new RuntimeException(
+ "Class " + udfClass + " is not a Hive function implementation");
+ }
+ }
+ } finally {
+ IOUtils.closeStream(inputStream);
+ }
+ }
+
private FunctionRegistry() {
// prevent instantiation
}
Modified:
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionTask.java
URL:
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionTask.java?rev=1209384&r1=1209383&r2=1209384&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionTask.java
(original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionTask.java Fri
Dec 2 08:14:10 2011
@@ -73,32 +73,15 @@ public class FunctionTask extends Task<F
private int createFunction(CreateFunctionDesc createFunctionDesc) {
try {
Class<?> udfClass = getUdfClass(createFunctionDesc);
- if (UDF.class.isAssignableFrom(udfClass)) {
- FunctionRegistry.registerTemporaryUDF(createFunctionDesc
- .getFunctionName(), (Class<? extends UDF>) udfClass, false);
- return 0;
- } else if (GenericUDF.class.isAssignableFrom(udfClass)) {
- FunctionRegistry.registerTemporaryGenericUDF(createFunctionDesc
- .getFunctionName(), (Class<? extends GenericUDF>) udfClass);
- return 0;
- } else if (GenericUDTF.class.isAssignableFrom(udfClass)) {
- FunctionRegistry.registerTemporaryGenericUDTF(createFunctionDesc
- .getFunctionName(), (Class<? extends GenericUDTF>) udfClass);
- return 0;
- } else if (UDAF.class.isAssignableFrom(udfClass)) {
- FunctionRegistry.registerTemporaryUDAF(createFunctionDesc
- .getFunctionName(), (Class<? extends UDAF>) udfClass);
- return 0;
- } else if (GenericUDAFResolver.class.isAssignableFrom(udfClass)) {
- FunctionRegistry.registerTemporaryGenericUDAF(createFunctionDesc
- .getFunctionName(), (GenericUDAFResolver) ReflectionUtils
- .newInstance(udfClass, null));
+ boolean registered = FunctionRegistry.registerTemporaryFunction(
+ createFunctionDesc.getFunctionName(),
+ udfClass);
+ if (registered) {
return 0;
}
console.printError("FAILED: Class " + createFunctionDesc.getClassName()
+ " does not implement UDF, GenericUDF, or UDAF");
return 1;
-
} catch (ClassNotFoundException e) {
console.printError("FAILED: Class " + createFunctionDesc.getClassName()
+ " not found");
LOG.info("create function: " + StringUtils.stringifyException(e));
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java
URL:
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java?rev=1209384&r1=1209383&r2=1209384&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java
(original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java Fri
Dec 2 08:14:10 2011
@@ -2275,4 +2275,8 @@ public final class Utilities {
return sb.toString();
}
+
+ public static Class getBuiltinUtilsClass() throws ClassNotFoundException {
+ return Class.forName("org.apache.hive.builtins.BuiltinUtils");
+ }
}
Modified:
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java
URL:
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java?rev=1209384&r1=1209383&r2=1209384&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java
(original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java
Fri Dec 2 08:14:10 2011
@@ -23,6 +23,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.net.URI;
+import java.net.URL;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
@@ -39,6 +40,7 @@ import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.ql.MapRedStats;
+import org.apache.hadoop.hive.ql.exec.FunctionRegistry;
import org.apache.hadoop.hive.ql.exec.Utilities;
import org.apache.hadoop.hive.ql.history.HiveHistory;
import org.apache.hadoop.hive.ql.metadata.HiveException;
@@ -174,6 +176,19 @@ public class SessionState {
this.conf = conf;
isSilent = conf.getBoolVar(HiveConf.ConfVars.HIVESESSIONSILENT);
ls = new LineageState();
+
+ // Register the Hive builtins jar and all of its functions
+ try {
+ Class<?> pluginClass = Utilities.getBuiltinUtilsClass();
+ URL jarLocation = pluginClass.getProtectionDomain().getCodeSource()
+ .getLocation();
+ add_builtin_resource(
+ ResourceType.JAR, jarLocation.toString());
+ FunctionRegistry.registerFunctionsFromPluginJar(
+ jarLocation, pluginClass.getClassLoader());
+ } catch (Exception ex) {
+ throw new RuntimeException("Failed to load Hive builtin functions", ex);
+ }
}
public void setCmd(String cmdString) {
@@ -509,8 +524,8 @@ public class SessionState {
return null;
}
- private final HashMap<ResourceType, HashSet<String>> resource_map =
- new HashMap<ResourceType, HashSet<String>>();
+ private final HashMap<ResourceType, Set<String>> resource_map =
+ new HashMap<ResourceType, Set<String>>();
public String add_resource(ResourceType t, String value) {
// By default don't convert to unix
@@ -525,23 +540,34 @@ public class SessionState {
return null;
}
- if (resource_map.get(t) == null) {
- resource_map.put(t, new HashSet<String>());
- }
+ Set<String> resourceMap = getResourceMap(t);
String fnlVal = value;
if (t.hook != null) {
- fnlVal = t.hook.preHook(resource_map.get(t), value);
+ fnlVal = t.hook.preHook(resourceMap, value);
if (fnlVal == null) {
return fnlVal;
}
}
getConsole().printInfo("Added resource: " + fnlVal);
- resource_map.get(t).add(fnlVal);
+ resourceMap.add(fnlVal);
return fnlVal;
}
+ public void add_builtin_resource(ResourceType t, String value) {
+ getResourceMap(t).add(value);
+ }
+
+ private Set<String> getResourceMap(ResourceType t) {
+ Set<String> result = resource_map.get(t);
+ if (result == null) {
+ result = new HashSet<String>();
+ resource_map.put(t, result);
+ }
+ return result;
+ }
+
/**
* Returns the list of filesystem schemas as regex which
* are permissible for download as a resource.
Modified: hive/trunk/ql/src/test/results/clientpositive/show_functions.q.out
URL:
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientpositive/show_functions.q.out?rev=1209384&r1=1209383&r2=1209384&view=diff
==============================================================================
--- hive/trunk/ql/src/test/results/clientpositive/show_functions.q.out
(original)
+++ hive/trunk/ql/src/test/results/clientpositive/show_functions.q.out Fri Dec
2 08:14:10 2011
@@ -155,6 +155,7 @@ to_utc_timestamp
trim
ucase
unhex
+union_map
unix_timestamp
upper
var_pop