You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hivemall.apache.org by my...@apache.org on 2018/06/06 09:09:32 UTC

[1/4] incubator-hivemall git commit: [HIVEMALL-145] Merge Brickhouse functions

Repository: incubator-hivemall
Updated Branches:
  refs/heads/master 7ea6bfd52 -> 494960324


http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/tools/hivemall-docs/src/main/java/hivemall/docs/FuncsListGeneratorMojo.java
----------------------------------------------------------------------
diff --git a/tools/hivemall-docs/src/main/java/hivemall/docs/FuncsListGeneratorMojo.java b/tools/hivemall-docs/src/main/java/hivemall/docs/FuncsListGeneratorMojo.java
new file mode 100644
index 0000000..0d58b3f
--- /dev/null
+++ b/tools/hivemall-docs/src/main/java/hivemall/docs/FuncsListGeneratorMojo.java
@@ -0,0 +1,264 @@
+/*
+ * 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 hivemall.docs;
+
+import static hivemall.docs.utils.MarkdownUtils.asCodeBlock;
+import static hivemall.docs.utils.MarkdownUtils.asInlineCode;
+import static hivemall.docs.utils.MarkdownUtils.asListElement;
+import static hivemall.docs.utils.MarkdownUtils.indent;
+import static org.apache.commons.lang.StringEscapeUtils.escapeHtml;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.annotation.Nonnull;
+
+import org.apache.hadoop.hive.ql.exec.Description;
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.plugins.annotations.ResolutionScope;
+import org.reflections.Reflections;
+
+/**
+ * Generate a list of UDFs for documentation.
+ *
+ * @link https://hivemall.incubator.apache.org/userguide/misc/generic_funcs.html
+ * @link https://hivemall.incubator.apache.org/userguide/misc/funcs.html
+ */
+@Mojo(name = "generate-funcs-list", defaultPhase = LifecyclePhase.PROCESS_CLASSES,
+        requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME,
+        configurator = "include-project-dependencies")
+public class FuncsListGeneratorMojo extends AbstractMojo {
+
+    @Parameter(defaultValue = "${basedir}", readonly = true)
+    private File basedir;
+
+    @Parameter(defaultValue = "${session}", readonly = true)
+    private MavenSession session;
+
+    @Parameter(defaultValue = "docs/gitbook/misc/generic_funcs.md")
+    private String pathToGenericFuncs;
+
+    @Parameter(defaultValue = "docs/gitbook/misc/funcs.md")
+    private String pathToFuncs;
+
+    private static final Map<String, List<String>> genericFuncsHeaders = new LinkedHashMap<>();
+    static {
+        genericFuncsHeaders.put("# Array",
+            Arrays.asList("hivemall.tools.array", "hivemall.tools.list"));
+        genericFuncsHeaders.put("# Bitset", Collections.singletonList("hivemall.tools.bits"));
+        genericFuncsHeaders.put("# Compression",
+            Collections.singletonList("hivemall.tools.compress"));
+        genericFuncsHeaders.put("# Datetime", Collections.singletonList("hivemall.tools.datetime"));
+        genericFuncsHeaders.put("# JSON", Collections.singletonList("hivemall.tools.json"));
+        genericFuncsHeaders.put("# Map", Collections.singletonList("hivemall.tools.map"));
+        genericFuncsHeaders.put("# MapReduce", Collections.singletonList("hivemall.tools.mapred"));
+        genericFuncsHeaders.put("# Math", Collections.singletonList("hivemall.tools.math"));
+        genericFuncsHeaders.put("# Matrix", Collections.singletonList("hivemall.tools.matrix"));
+        genericFuncsHeaders.put("# Sanity Checks",
+            Collections.singletonList("hivemall.tools.sanity"));
+        genericFuncsHeaders.put("# Text processing",
+            Collections.singletonList("hivemall.tools.text"));
+        genericFuncsHeaders.put("# Timeseries",
+            Collections.singletonList("hivemall.tools.timeseries"));
+        genericFuncsHeaders.put("# Vector", Collections.singletonList("hivemall.tools.vector"));
+        genericFuncsHeaders.put("# Others", Collections.singletonList("hivemall.tools"));
+    }
+
+    private static final Map<String, List<String>> funcsHeaders = new LinkedHashMap<>();
+    static {
+        funcsHeaders.put("# Regression", Collections.singletonList("hivemall.regression"));
+        funcsHeaders.put("# Classification", Collections.<String>emptyList());
+        funcsHeaders.put("## Binary classification",
+            Collections.singletonList("hivemall.classifier"));
+        funcsHeaders.put("## Multiclass classification",
+            Collections.singletonList("hivemall.classifier.multiclass"));
+        funcsHeaders.put("# Matrix factorization", Collections.singletonList("hivemall.mf"));
+        funcsHeaders.put("# Factorization machines", Collections.singletonList("hivemall.fm"));
+        funcsHeaders.put("# Recommendation", Collections.singletonList("hivemall.recommend"));
+        funcsHeaders.put("# Anomaly detection", Collections.singletonList("hivemall.anomaly"));
+        funcsHeaders.put("# Topic modeling", Collections.singletonList("hivemall.topicmodel"));
+        funcsHeaders.put("# Preprocessing", Collections.singletonList("hivemall.ftvec"));
+        funcsHeaders.put("## Data amplification",
+            Collections.singletonList("hivemall.ftvec.amplify"));
+        funcsHeaders.put("## Feature binning", Collections.singletonList("hivemall.ftvec.binning"));
+        funcsHeaders.put("## Feature format conversion",
+            Collections.singletonList("hivemall.ftvec.conv"));
+        funcsHeaders.put("## Feature hashing", Collections.singletonList("hivemall.ftvec.hashing"));
+        funcsHeaders.put("## Feature paring", Collections.singletonList("hivemall.ftvec.pairing"));
+        funcsHeaders.put("## Ranking", Collections.singletonList("hivemall.ftvec.ranking"));
+        funcsHeaders.put("## Feature scaling", Collections.singletonList("hivemall.ftvec.scaling"));
+        funcsHeaders.put("## Feature selection",
+            Collections.singletonList("hivemall.ftvec.selection"));
+        funcsHeaders.put("## Feature transformation and vectorization",
+            Collections.singletonList("hivemall.ftvec.trans"));
+        funcsHeaders.put("# Geospatial functions",
+            Collections.singletonList("hivemall.geospatial"));
+        funcsHeaders.put("# Distance measures", Collections.singletonList("hivemall.knn.distance"));
+        funcsHeaders.put("# Locality-sensitive hashing",
+            Collections.singletonList("hivemall.knn.lsh"));
+        funcsHeaders.put("# Similarity measures",
+            Collections.singletonList("hivemall.knn.similarity"));
+        funcsHeaders.put("# Evaluation", Collections.singletonList("hivemall.evaluation"));
+        funcsHeaders.put("# Sketching",
+            Arrays.asList("hivemall.sketch.hll", "hivemall.sketch.bloom"));
+        funcsHeaders.put("# Ensemble learning", Collections.singletonList("hivemall.ensemble"));
+        funcsHeaders.put("## Bagging", Collections.singletonList("hivemall.ensemble.bagging"));
+        funcsHeaders.put("# Decision trees and RandomForest", Arrays.asList(
+            "hivemall.smile.classification", "hivemall.smile.regression", "hivemall.smile.tools"));
+        funcsHeaders.put("# XGBoost", Arrays.asList("hivemall.xgboost.classification",
+            "hivemall.xgboost.regression", "hivemall.xgboost.tools"));
+        funcsHeaders.put("# Others",
+            Arrays.asList("hivemall", "hivemall.dataset", "hivemall.ftvec.text"));
+    }
+
+    @Override
+    public void execute() throws MojoExecutionException {
+        if (!isReactorRootProject()) {
+            // output only once across the projects
+            return;
+        }
+
+        generate(new File(basedir, pathToGenericFuncs),
+            "This page describes a list of useful Hivemall generic functions. See also a [list of machine-learning-related functions](./funcs.md).",
+            genericFuncsHeaders);
+        generate(new File(basedir, pathToFuncs),
+            "This page describes a list of Hivemall functions. See also a [list of generic Hivemall functions](./generic_funcs.md) for more general-purpose functions such as array and map UDFs.",
+            funcsHeaders);
+    }
+
+    private boolean isReactorRootProject() {
+        return session.getExecutionRootDirectory().equalsIgnoreCase(basedir.toString());
+    }
+
+    private void generate(@Nonnull File outputFile, @Nonnull String preface,
+            @Nonnull Map<String, List<String>> headers) throws MojoExecutionException {
+        Reflections reflections = new Reflections("hivemall");
+        Set<Class<?>> annotatedClasses = reflections.getTypesAnnotatedWith(Description.class);
+
+        StringBuilder sb = new StringBuilder();
+        Map<String, Set<String>> packages = new HashMap<>();
+
+        Pattern func = Pattern.compile("_FUNC_(\\(.*?\\))(.*)", Pattern.DOTALL);
+
+        for (Class<?> annotatedClass : annotatedClasses) {
+            Deprecated deprecated = annotatedClass.getAnnotation(Deprecated.class);
+            if (deprecated != null) {
+                continue;
+            }
+
+            Description description = annotatedClass.getAnnotation(Description.class);
+
+            String value = description.value().replaceAll("\n", " ");
+            Matcher matcher = func.matcher(value);
+            if (matcher.find()) {
+                value = asInlineCode(description.name() + matcher.group(1))
+                        + escapeHtml(matcher.group(2));
+            }
+            sb.append(asListElement(value));
+
+            StringBuilder sbExtended = new StringBuilder();
+            if (!description.extended().isEmpty()) {
+                sbExtended.append(description.extended());
+                sb.append("\n");
+            }
+
+            String extended = sbExtended.toString();
+            if (extended.isEmpty()) {
+                sb.append("\n");
+            } else {
+                if (extended.toLowerCase().contains("select")) { // extended description contains SQL statements
+                    sb.append(indent(asCodeBlock(extended, "sql")));
+                } else {
+                    sb.append(indent(asCodeBlock(extended)));
+                }
+            }
+
+            String packageName = annotatedClass.getPackage().getName();
+            if (!packages.containsKey(packageName)) {
+                Set<String> set = new TreeSet<>();
+                packages.put(packageName, set);
+            }
+            Set<String> List = packages.get(packageName);
+            List.add(sb.toString());
+
+            sb.setLength(0);
+        }
+
+        try (PrintWriter writer = new PrintWriter(outputFile)) {
+            // license header
+            writer.println("<!--");
+            try {
+                File licenseFile = new File(basedir, "resources/license-header.txt");
+                FileReader fileReader = new FileReader(licenseFile);
+
+                try (BufferedReader bufferedReader = new BufferedReader(fileReader)) {
+                    String line;
+                    while ((line = bufferedReader.readLine()) != null) {
+                        writer.println(indent(line));
+                    }
+                }
+            } catch (IOException e) {
+                throw new MojoExecutionException("Failed to read license file");
+            }
+            writer.println("-->\n");
+
+            writer.println(preface);
+
+            writer.println("\n<!-- toc -->\n");
+
+            for (Map.Entry<String, List<String>> e : headers.entrySet()) {
+                writer.println(e.getKey() + "\n");
+                List<String> packageNames = e.getValue();
+                for (String packageName : packageNames) {
+                    if (!packages.containsKey(packageName)) {
+                        writer.close();
+                        throw new MojoExecutionException(
+                            "Failed to find package in the classpath: " + packageName);
+                    }
+                    for (String desc : packages.get(packageName)) {
+                        writer.println(desc);
+                    }
+                }
+            }
+
+            writer.flush();
+        } catch (FileNotFoundException e) {
+            throw new MojoExecutionException("Output file is not found");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/tools/hivemall-docs/src/main/java/hivemall/docs/IncludeProjectDependenciesComponentConfigurator.java
----------------------------------------------------------------------
diff --git a/tools/hivemall-docs/src/main/java/hivemall/docs/IncludeProjectDependenciesComponentConfigurator.java b/tools/hivemall-docs/src/main/java/hivemall/docs/IncludeProjectDependenciesComponentConfigurator.java
new file mode 100644
index 0000000..29774f0
--- /dev/null
+++ b/tools/hivemall-docs/src/main/java/hivemall/docs/IncludeProjectDependenciesComponentConfigurator.java
@@ -0,0 +1,100 @@
+/*
+ * 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 hivemall.docs;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+import org.codehaus.classworlds.ClassRealm;
+import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.component.configurator.AbstractComponentConfigurator;
+import org.codehaus.plexus.component.configurator.ComponentConfigurationException;
+import org.codehaus.plexus.component.configurator.ConfigurationListener;
+import org.codehaus.plexus.component.configurator.converters.composite.ObjectWithFieldsConverter;
+import org.codehaus.plexus.component.configurator.converters.special.ClassRealmConverter;
+import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
+import org.codehaus.plexus.configuration.PlexusConfiguration;
+
+/**
+ * A custom ComponentConfigurator which adds the project's runtime classpath elements to the MOJO
+ * classloader.
+ */
+@SuppressWarnings("deprecation")
+@Component(role = org.codehaus.plexus.component.configurator.ComponentConfigurator.class,
+        hint = "include-project-dependencies")
+public class IncludeProjectDependenciesComponentConfigurator extends AbstractComponentConfigurator {
+
+    public void configureComponent(final Object component, final PlexusConfiguration configuration,
+            final ExpressionEvaluator expressionEvaluator, final ClassRealm containerRealm,
+            final ConfigurationListener listener) throws ComponentConfigurationException {
+        addProjectDependenciesToClassRealm(expressionEvaluator, containerRealm);
+
+        converterLookup.registerConverter(new ClassRealmConverter(containerRealm));
+
+        ObjectWithFieldsConverter converter = new ObjectWithFieldsConverter();
+
+        converter.processConfiguration(converterLookup, component, containerRealm.getClassLoader(),
+            configuration, expressionEvaluator, listener);
+    }
+
+    @SuppressWarnings("unchecked")
+    private static void addProjectDependenciesToClassRealm(
+            final ExpressionEvaluator expressionEvaluator, final ClassRealm containerRealm)
+            throws ComponentConfigurationException {
+        final List<String> runtimeClasspathElements;
+        try {
+            // noinspection unchecked
+            runtimeClasspathElements = (List<String>) expressionEvaluator.evaluate(
+                "${project.runtimeClasspathElements}");
+        } catch (ExpressionEvaluationException e) {
+            throw new ComponentConfigurationException(
+                "There was a problem evaluating: ${project.runtimeClasspathElements}", e);
+        }
+
+        // Add the project dependencies to the ClassRealm
+        final URL[] urls = buildURLs(runtimeClasspathElements);
+        for (URL url : urls) {
+            containerRealm.addConstituent(url);
+        }
+    }
+
+    @Nonnull
+    private static URL[] buildURLs(@Nonnull final List<String> runtimeClasspathElements)
+            throws ComponentConfigurationException {
+        // Add the projects classes and dependencies
+        final List<URL> urls = new ArrayList<>(runtimeClasspathElements.size());
+        for (String element : runtimeClasspathElements) {
+            try {
+                URL url = new File(element).toURI().toURL();
+                urls.add(url);
+            } catch (MalformedURLException e) {
+                throw new ComponentConfigurationException(
+                    "Unable to access project dependency: " + element, e);
+            }
+        }
+        return urls.toArray(new URL[urls.size()]);
+    }
+
+}


[3/4] incubator-hivemall git commit: [HIVEMALL-145] Merge Brickhouse functions

Posted by my...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/json/ToJsonUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/json/ToJsonUDF.java b/core/src/main/java/hivemall/tools/json/ToJsonUDF.java
index 70c62b9..95d1af9 100644
--- a/core/src/main/java/hivemall/tools/json/ToJsonUDF.java
+++ b/core/src/main/java/hivemall/tools/json/ToJsonUDF.java
@@ -37,8 +37,82 @@ import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
 import org.apache.hadoop.io.Text;
 
+// @formatter:off
 @Description(name = "to_json",
-        value = "_FUNC_(ANY object [, const array<string>|const string columnNames]) - Returns Json string")
+        value = "_FUNC_(ANY object [, const array<string>|const string columnNames]) - Returns Json string",
+        extended = "SELECT \n" +
+                "  NAMED_STRUCT(\"Name\", \"John\", \"age\", 31),\n" +
+                "  to_json(\n" +
+                "     NAMED_STRUCT(\"Name\", \"John\", \"age\", 31)\n" +
+                "  ),\n" +
+                "  to_json(\n" +
+                "     NAMED_STRUCT(\"Name\", \"John\", \"age\", 31),\n" +
+                "     array('Name', 'age')\n" +
+                "  ),\n" +
+                "  to_json(\n" +
+                "     NAMED_STRUCT(\"Name\", \"John\", \"age\", 31),\n" +
+                "     array('name', 'age')\n" +
+                "  ),\n" +
+                "  to_json(\n" +
+                "     NAMED_STRUCT(\"Name\", \"John\", \"age\", 31),\n" +
+                "     array('age')\n" +
+                "  ),\n" +
+                "  to_json(\n" +
+                "     NAMED_STRUCT(\"Name\", \"John\", \"age\", 31),\n" +
+                "     array()\n" +
+                "  ),\n" +
+                "  to_json(\n" +
+                "     null,\n" +
+                "     array()\n" +
+                "  ),\n" +
+                "  to_json(\n" +
+                "    struct(\"123\", \"456\", 789, array(314,007)),\n" +
+                "    array('ti','si','i','bi')\n" +
+                "  ),\n" +
+                "  to_json(\n" +
+                "    struct(\"123\", \"456\", 789, array(314,007)),\n" +
+                "    'ti,si,i,bi'\n" +
+                "  ),\n" +
+                "  to_json(\n" +
+                "    struct(\"123\", \"456\", 789, array(314,007))\n" +
+                "  ),\n" +
+                "  to_json(\n" +
+                "    NAMED_STRUCT(\"country\", \"japan\", \"city\", \"tokyo\")\n" +
+                "  ),\n" +
+                "  to_json(\n" +
+                "    NAMED_STRUCT(\"country\", \"japan\", \"city\", \"tokyo\"), \n" +
+                "    array('city')\n" +
+                "  ),\n" +
+                "  to_json(\n" +
+                "    ARRAY(\n" +
+                "      NAMED_STRUCT(\"country\", \"japan\", \"city\", \"tokyo\"), \n" +
+                "      NAMED_STRUCT(\"country\", \"japan\", \"city\", \"osaka\")\n" +
+                "    )\n" +
+                "  ),\n" +
+                "  to_json(\n" +
+                "    ARRAY(\n" +
+                "      NAMED_STRUCT(\"country\", \"japan\", \"city\", \"tokyo\"), \n" +
+                "      NAMED_STRUCT(\"country\", \"japan\", \"city\", \"osaka\")\n" +
+                "    ),\n" +
+                "    array('city')\n" +
+                "  );\n" +
+                "```\n\n" +
+                "```\n" +
+                " {\"name\":\"John\",\"age\":31}\n"
+                + " {\"name\":\"John\",\"age\":31}\n"
+                + " {\"Name\":\"John\",\"age\":31}\n"
+                + " {\"name\":\"John\",\"age\":31}\n"
+                + " {\"age\":31}\n"
+                + " {}\n"
+                + " NULL\n"
+                + " {\"ti\":\"123\",\"si\":\"456\",\"i\":789,\"bi\":[314,7]}\n"
+                + " {\"ti\":\"123\",\"si\":\"456\",\"i\":789,\"bi\":[314,7]}\n"
+                + " {\"col1\":\"123\",\"col2\":\"456\",\"col3\":789,\"col4\":[314,7]}\n"
+                + " {\"country\":\"japan\",\"city\":\"tokyo\"}\n"
+                + " {\"city\":\"tokyo\"}\n"
+                + " [{\"country\":\"japan\",\"city\":\"tokyo\"},{\"country\":\"japan\",\"city\":\"osaka\"}]\n"
+                + " [{\"country\":\"japan\",\"city\":\"tokyo\"},{\"country\":\"japan\",\"city\":\"osaka\"}]")
+// @formatter:on
 @UDFType(deterministic = true, stateful = false)
 public final class ToJsonUDF extends GenericUDF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/list/UDAFToOrderedList.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/list/UDAFToOrderedList.java b/core/src/main/java/hivemall/tools/list/UDAFToOrderedList.java
index 5ef6ddb..83adb0f 100644
--- a/core/src/main/java/hivemall/tools/list/UDAFToOrderedList.java
+++ b/core/src/main/java/hivemall/tools/list/UDAFToOrderedList.java
@@ -66,15 +66,16 @@ import org.apache.hadoop.io.IntWritable;
 /**
  * Return list of values sorted by value itself or specific key.
  */
+//@formatter:off
 @Description(name = "to_ordered_list",
         value = "_FUNC_(PRIMITIVE value [, PRIMITIVE key, const string options])"
                 + " - Return list of values sorted by value itself or specific key",
-        extended = "with t as (\n" + "    select 5 as key, 'apple' as value\n" + "    union all\n"
-                + "    select 3 as key, 'banana' as value\n" + "    union all\n"
-                + "    select 4 as key, 'candy' as value\n" + "    union all\n"
-                + "    select 2 as key, 'donut' as value\n" + "    union all\n"
-                + "    select 3 as key, 'egg' as value\n" + ")\n"
-                + "select                                             -- expected output\n"
+        extended = "WITH t as (\n" + "    SELECT 5 as key, 'apple' as value\n" + "    UNION ALL\n"
+                + "    SELECT 3 as key, 'banana' as value\n" + "    UNION ALL\n"
+                + "    SELECT 4 as key, 'candy' as value\n" + "    UNION ALL\n"
+                + "    SELECT 2 as key, 'donut' as value\n" + "    UNION ALL\n"
+                + "    SELECT 3 as key, 'egg' as value\n" + ")\n"
+                + "SELECT                                             -- expected output\n"
                 + "    to_ordered_list(value, key, '-reverse'),       -- [apple, candy, (banana, egg | egg, banana), donut] (reverse order)\n"
                 + "    to_ordered_list(value, key, '-k 2'),           -- [apple, candy] (top-k)\n"
                 + "    to_ordered_list(value, key, '-k 100'),         -- [apple, candy, (banana, egg | egg, banana), dunut]\n"
@@ -86,7 +87,8 @@ import org.apache.hadoop.io.IntWritable;
                 + "    to_ordered_list(value, '-k 2'),                -- [egg, donut] (alphabetically)\n"
                 + "    to_ordered_list(key, '-k -2 -reverse'),        -- [5, 4] (top-2 keys)\n"
                 + "    to_ordered_list(key)                           -- [2, 3, 3, 4, 5] (natural ordered keys)\n"
-                + "from\n" + "    t")
+                + "FROM\n" + "    t")
+//@formatter:on
 public final class UDAFToOrderedList extends AbstractGenericUDAFResolver {
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/map/MapExcludeKeysUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/map/MapExcludeKeysUDF.java b/core/src/main/java/hivemall/tools/map/MapExcludeKeysUDF.java
new file mode 100644
index 0000000..6a46210
--- /dev/null
+++ b/core/src/main/java/hivemall/tools/map/MapExcludeKeysUDF.java
@@ -0,0 +1,100 @@
+/*
+ * 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 hivemall.tools.map;
+
+import hivemall.utils.hadoop.HiveUtils;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.hadoop.hive.ql.exec.Description;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.udf.UDFType;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
+import org.apache.hadoop.hive.serde2.objectinspector.ListObjectInspector;
+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.objectinspector.ObjectInspectorUtils.ObjectInspectorCopyOption;
+
+@Description(name = "map_exclude_keys",
+        value = "_FUNC_(Map<K,V> map, array<K> filteringKeys)"
+                + " - Returns the filtered entries of a map not having specified keys",
+        extended = "SELECT map_exclude_keys(map(1,'one',2,'two',3,'three'),array(2,3));\n"
+                + "{1:\"one\"}")
+@UDFType(deterministic = true, stateful = false)
+public final class MapExcludeKeysUDF extends GenericUDF {
+
+    private MapObjectInspector mapOI;
+    private ListObjectInspector listOI;
+
+    @Override
+    public ObjectInspector initialize(ObjectInspector[] argOIs) throws UDFArgumentException {
+        if (argOIs.length != 2) {
+            throw new UDFArgumentLengthException(
+                "Expected two arguments for map_filter_keys: " + argOIs.length);
+        }
+
+        this.mapOI = HiveUtils.asMapOI(argOIs[0]);
+        this.listOI = HiveUtils.asListOI(argOIs[1]);
+
+        ObjectInspector mapKeyOI = mapOI.getMapKeyObjectInspector();
+        ObjectInspector filterKeyOI = listOI.getListElementObjectInspector();
+
+        if (!ObjectInspectorUtils.compareTypes(mapKeyOI, filterKeyOI)) {
+            throw new UDFArgumentException("Element types does not match: mapKey "
+                    + mapKeyOI.getTypeName() + ", filterKey" + filterKeyOI.getTypeName());
+        }
+
+        return ObjectInspectorUtils.getStandardObjectInspector(mapOI,
+            ObjectInspectorCopyOption.WRITABLE);
+    }
+
+    @Override
+    public Map<?, ?> evaluate(DeferredObject[] arguments) throws HiveException {
+        Object arg0 = arguments[0].get();
+        if (arg0 == null) {
+            return null;
+        }
+        final Map<?, ?> map = (Map<?, ?>) ObjectInspectorUtils.copyToStandardObject(arg0, mapOI,
+            ObjectInspectorCopyOption.WRITABLE);
+
+        Object arg1 = arguments[1].get();
+        if (arg1 == null) {
+            return map;
+        }
+
+        final List<?> filterKeys = (List<?>) ObjectInspectorUtils.copyToStandardObject(arg1, listOI,
+            ObjectInspectorCopyOption.WRITABLE);
+        for (Object k : filterKeys) {
+            map.remove(k);
+        }
+
+        return map;
+    }
+
+    @Override
+    public String getDisplayString(String[] children) {
+        return "map_exclude_keys(" + StringUtils.join(children, ',') + ")";
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/map/MapIncludeKeysUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/map/MapIncludeKeysUDF.java b/core/src/main/java/hivemall/tools/map/MapIncludeKeysUDF.java
new file mode 100644
index 0000000..902569f
--- /dev/null
+++ b/core/src/main/java/hivemall/tools/map/MapIncludeKeysUDF.java
@@ -0,0 +1,103 @@
+/*
+ * 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 hivemall.tools.map;
+
+import hivemall.utils.hadoop.HiveUtils;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.hadoop.hive.ql.exec.Description;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.udf.UDFType;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
+import org.apache.hadoop.hive.serde2.objectinspector.ListObjectInspector;
+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.objectinspector.ObjectInspectorUtils.ObjectInspectorCopyOption;
+
+@Description(name = "map_include_keys",
+        value = "_FUNC_(Map<K,V> map, array<K> filteringKeys)"
+                + " - Returns the filtered entries of a map having specified keys",
+        extended = "SELECT map_include_keys(map(1,'one',2,'two',3,'three'),array(2,3));\n"
+                + "{2:\"two\",3:\"three\"}")
+@UDFType(deterministic = true, stateful = false)
+public final class MapIncludeKeysUDF extends GenericUDF {
+
+    private MapObjectInspector mapOI;
+    private ListObjectInspector listOI;
+
+    @Override
+    public ObjectInspector initialize(ObjectInspector[] argOIs) throws UDFArgumentException {
+        if (argOIs.length != 2) {
+            throw new UDFArgumentLengthException(
+                "Expected two arguments for map_filter_keys: " + argOIs.length);
+        }
+
+        this.mapOI = HiveUtils.asMapOI(argOIs[0]);
+        this.listOI = HiveUtils.asListOI(argOIs[1]);
+
+        ObjectInspector mapKeyOI = mapOI.getMapKeyObjectInspector();
+        ObjectInspector filterKeyOI = listOI.getListElementObjectInspector();
+        if (!ObjectInspectorUtils.compareTypes(mapKeyOI, filterKeyOI)) {
+            throw new UDFArgumentException("Element types does not match: mapKey "
+                    + mapKeyOI.getTypeName() + ", filterKey" + filterKeyOI.getTypeName());
+        }
+
+        return ObjectInspectorUtils.getStandardObjectInspector(mapOI,
+            ObjectInspectorCopyOption.WRITABLE);
+    }
+
+    @Override
+    public Map<?, ?> evaluate(DeferredObject[] arguments) throws HiveException {
+        Object arg0 = arguments[0].get();
+        if (arg0 == null) {
+            return null;
+        }
+        final Map<?, ?> map = (Map<?, ?>) ObjectInspectorUtils.copyToStandardObject(arg0, mapOI,
+            ObjectInspectorCopyOption.WRITABLE);
+
+        Object arg1 = arguments[1].get();
+        if (arg1 == null) {
+            return null;
+        }
+        final List<?> filterKeys = (List<?>) ObjectInspectorUtils.copyToStandardObject(arg1, listOI,
+            ObjectInspectorCopyOption.WRITABLE);
+
+        final Map<Object, Object> result = new HashMap<>();
+        for (Object k : filterKeys) {
+            Object v = map.get(k);
+            if (v != null) {
+                result.put(k, v);
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public String getDisplayString(String[] children) {
+        return "map_include_keys(" + StringUtils.join(children, ',') + ")";
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/map/MapIndexUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/map/MapIndexUDF.java b/core/src/main/java/hivemall/tools/map/MapIndexUDF.java
new file mode 100644
index 0000000..73ffa36
--- /dev/null
+++ b/core/src/main/java/hivemall/tools/map/MapIndexUDF.java
@@ -0,0 +1,104 @@
+/*
+ * 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 hivemall.tools.map;
+
+import org.apache.hadoop.hive.ql.exec.Description;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.udf.UDFType;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
+import org.apache.hadoop.hive.serde2.objectinspector.MapObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters.Converter;
+import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
+
+//@formatter:off
+@Description(name = "map_index",
+        value = "_FUNC_(a, n) - Returns the n-th element of the given array", 
+        extended = "WITH tmp as (\n" + 
+                "  SELECT \"one\" as key\n" + 
+                "  UNION ALL\n" + 
+                "  SELECT \"two\" as key\n" + 
+                ")\n" + 
+                "SELECT map_index(map(\"one\",1,\"two\",2),key)\n" + 
+                "FROM tmp;\n\n" +
+                "1\n" + 
+                "2")
+//@formatter:on
+@UDFType(deterministic = true, stateful = false)
+public final class MapIndexUDF extends GenericUDF {
+
+    private transient MapObjectInspector mapOI;
+    private transient Converter converter;
+
+    @Override
+    public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
+        if (arguments.length != 2) {
+            throw new UDFArgumentLengthException("The function INDEX accepts exactly 2 arguments.");
+        }
+
+        if (arguments[0] instanceof MapObjectInspector) {
+            this.mapOI = (MapObjectInspector) arguments[0];
+        } else {
+            throw new UDFArgumentTypeException(0, "\"map\" is expected at function INDEX, but \""
+                    + arguments[0].getTypeName() + "\" is found");
+        }
+
+        // index has to be a primitive
+        if (!(arguments[1] instanceof PrimitiveObjectInspector)) {
+            throw new UDFArgumentTypeException(1,
+                "Primitive Type is expected but " + arguments[1].getTypeName() + "\" is found");
+        }
+
+        PrimitiveObjectInspector inputOI = (PrimitiveObjectInspector) arguments[1];
+        ObjectInspector indexOI =
+                ObjectInspectorConverters.getConvertedOI(inputOI, mapOI.getMapKeyObjectInspector());
+        this.converter = ObjectInspectorConverters.getConverter(inputOI, indexOI);
+
+        return mapOI.getMapValueObjectInspector();
+    }
+
+    @Override
+    public Object evaluate(DeferredObject[] arguments) throws HiveException {
+        assert (arguments.length == 2);
+        Object index = arguments[1].get();
+
+        Object indexObject = converter.convert(index);
+        if (indexObject == null) {
+            return null;
+        }
+
+        Object arg0 = arguments[0].get();
+        if (arg0 == null) {
+            return null;
+        }
+
+        return mapOI.getMapValueElement(arg0, indexObject);
+    }
+
+    @Override
+    public String getDisplayString(String[] children) {
+        assert (children.length == 2);
+        return children[0] + "[" + children[1] + "]";
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/map/MapKeyValuesUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/map/MapKeyValuesUDF.java b/core/src/main/java/hivemall/tools/map/MapKeyValuesUDF.java
new file mode 100644
index 0000000..3992f9e
--- /dev/null
+++ b/core/src/main/java/hivemall/tools/map/MapKeyValuesUDF.java
@@ -0,0 +1,97 @@
+/*
+ * 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 hivemall.tools.map;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Nullable;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.hadoop.hive.ql.exec.Description;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.udf.UDFType;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
+import org.apache.hadoop.hive.serde2.objectinspector.MapObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector.Category;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
+
+@Description(name = "map_key_values",
+        value = "_FUNC_(map) - " + "Returns a array of key-value pairs.",
+        extended = "SELECT map_key_values(map(\"one\",1,\"two\",2));\n\n"
+                + "[{\"key\":\"one\",\"value\":1},{\"key\":\"two\",\"value\":2}]")
+@UDFType(deterministic = true, stateful = false)
+public final class MapKeyValuesUDF extends GenericUDF {
+
+    private final ArrayList<Object[]> retArray = new ArrayList<Object[]>();
+
+    private MapObjectInspector mapOI;
+
+    @Override
+    public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
+        if (arguments.length != 1) {
+            throw new UDFArgumentLengthException(
+                "The function MAP_KEYS only accepts one argument.");
+        } else if (!(arguments[0] instanceof MapObjectInspector)) {
+            throw new UDFArgumentTypeException(0,
+                "\"" + Category.MAP.toString().toLowerCase()
+                        + "\" is expected at function MAP_KEYS, " + "but \""
+                        + arguments[0].getTypeName() + "\" is found");
+        }
+
+        this.mapOI = (MapObjectInspector) arguments[0];
+
+        List<String> structFieldNames = new ArrayList<String>();
+        List<ObjectInspector> structFieldObjectInspectors = new ArrayList<ObjectInspector>();
+        structFieldNames.add("key");
+        structFieldObjectInspectors.add(mapOI.getMapKeyObjectInspector());
+        structFieldNames.add("value");
+        structFieldObjectInspectors.add(mapOI.getMapValueObjectInspector());
+
+        return ObjectInspectorFactory.getStandardListObjectInspector(
+            ObjectInspectorFactory.getStandardStructObjectInspector(structFieldNames,
+                structFieldObjectInspectors));
+    }
+
+    @Override
+    @Nullable
+    public List<Object[]> evaluate(DeferredObject[] arguments) throws HiveException {
+        Object mapObj = arguments[0].get();
+        if (mapObj == null) {
+            return null;
+        }
+        retArray.clear();
+        final Map<?, ?> map = mapOI.getMap(mapObj);
+        for (Map.Entry<?, ?> e : map.entrySet()) {
+            retArray.add(new Object[] {e.getKey(), e.getValue()});
+        }
+        return retArray;
+    }
+
+    @Override
+    public String getDisplayString(String[] children) {
+        return "map_key_values(" + StringUtils.join(children, ',') + ')';
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/map/MergeMapsUDAF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/map/MergeMapsUDAF.java b/core/src/main/java/hivemall/tools/map/MergeMapsUDAF.java
new file mode 100644
index 0000000..e4a2516
--- /dev/null
+++ b/core/src/main/java/hivemall/tools/map/MergeMapsUDAF.java
@@ -0,0 +1,172 @@
+/*
+ * 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 hivemall.tools.map;
+
+import hivemall.utils.hadoop.HiveUtils;
+import hivemall.utils.lang.Preconditions;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.annotation.Nonnull;
+
+import org.apache.hadoop.hive.ql.exec.Description;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
+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.serde2.objectinspector.MapObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector.Category;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
+import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo;
+
+//@formatter:off
+@Description(name = "merge_maps",
+        value = "_FUNC_(x) - Returns a map which contains the union of an aggregation of maps."
+                + " Note that an existing value of a key can be replaced with the other duplicate key entry.",
+        extended = "SELECT \n" + 
+                "  merge_maps(m) \n" + 
+                "FROM (\n" + 
+                "  SELECT map('A',10,'B',20,'C',30) \n" + 
+                "  UNION ALL \n" + 
+                "  SELECT map('A',10,'B',20,'C',30)\n" + 
+                ") t")
+//@formatter:on
+public final class MergeMapsUDAF extends AbstractGenericUDAFResolver {
+
+    @Override
+    public MergeMapsEvaluator getEvaluator(TypeInfo[] types) throws SemanticException {
+        if (types.length != 1) {
+            throw new UDFArgumentTypeException(types.length - 1,
+                "One argument is expected but got " + types.length);
+        }
+        TypeInfo paramType = types[0];
+        if (paramType.getCategory() != Category.MAP) {
+            throw new UDFArgumentTypeException(0, "Only maps supported for now ");
+        }
+        return new MergeMapsEvaluator();
+    }
+
+    public static final class MergeMapsEvaluator extends GenericUDAFEvaluator {
+
+        private transient MapObjectInspector inputMapOI, mergeMapOI;
+        private transient ObjectInspector inputKeyOI, inputValOI;
+
+        @AggregationType(estimable = false)
+        static final class MapAggBuffer extends AbstractAggregationBuffer {
+            @Nonnull
+            final Map<Object, Object> collectMap = new HashMap<Object, Object>();
+        }
+
+        public ObjectInspector init(Mode mode, ObjectInspector[] parameters) throws HiveException {
+            Preconditions.checkArgument(parameters.length == 1);
+            super.init(mode, parameters);
+
+            // initialize input
+            if (mode == Mode.PARTIAL1 || mode == Mode.COMPLETE) {// from original data
+                this.inputMapOI = HiveUtils.asMapOI(parameters[0]);
+                this.inputKeyOI = inputMapOI.getMapKeyObjectInspector();
+                this.inputValOI = inputMapOI.getMapValueObjectInspector();
+            } else {// from partial aggregation
+                this.mergeMapOI = HiveUtils.asMapOI(parameters[0]);
+                this.inputKeyOI = mergeMapOI.getMapKeyObjectInspector();
+                this.inputValOI = mergeMapOI.getMapValueObjectInspector();
+            }
+
+            return ObjectInspectorFactory.getStandardMapObjectInspector(
+                ObjectInspectorUtils.getStandardObjectInspector(inputKeyOI),
+                ObjectInspectorUtils.getStandardObjectInspector(inputValOI));
+        }
+
+        @Override
+        public MapAggBuffer getNewAggregationBuffer() throws HiveException {
+            MapAggBuffer buff = new MapAggBuffer();
+            reset(buff);
+            return buff;
+        }
+
+        @Override
+        public void reset(@SuppressWarnings("deprecation") AggregationBuffer buff)
+                throws HiveException {
+            MapAggBuffer aggrBuf = (MapAggBuffer) buff;
+            aggrBuf.collectMap.clear();
+        }
+
+        @Override
+        public void iterate(@SuppressWarnings("deprecation") AggregationBuffer agg,
+                Object[] parameters) throws HiveException {
+            Preconditions.checkArgument(parameters.length == 1);
+
+            Object param0 = parameters[0];
+            if (param0 == null) {
+                return;
+            }
+
+            Map<?, ?> m = inputMapOI.getMap(param0);
+            MapAggBuffer myagg = (MapAggBuffer) agg;
+            putIntoSet(m, myagg.collectMap, inputMapOI);
+        }
+
+        @Override
+        public void merge(@SuppressWarnings("deprecation") AggregationBuffer agg, Object partial)
+                throws HiveException {
+            if (partial == null) {
+                return;
+            }
+
+            MapAggBuffer myagg = (MapAggBuffer) agg;
+            Map<?, ?> m = mergeMapOI.getMap(partial);
+            putIntoSet(m, myagg.collectMap, mergeMapOI);
+        }
+
+        private static void putIntoSet(@Nonnull final Map<?, ?> m,
+                @Nonnull final Map<Object, Object> dst, @Nonnull final MapObjectInspector mapOI) {
+            final ObjectInspector keyOI = mapOI.getMapKeyObjectInspector();
+            final ObjectInspector valueOI = mapOI.getMapValueObjectInspector();
+
+            for (Map.Entry<?, ?> e : m.entrySet()) {
+                Object k = e.getKey();
+                Object v = e.getValue();
+                Object keyCopy = ObjectInspectorUtils.copyToStandardObject(k, keyOI);
+                Object valCopy = ObjectInspectorUtils.copyToStandardObject(v, valueOI);
+                dst.put(keyCopy, valCopy);
+            }
+        }
+
+        @Override
+        @Nonnull
+        public Map<Object, Object> terminatePartial(
+                @SuppressWarnings("deprecation") AggregationBuffer agg) throws HiveException {
+            MapAggBuffer myagg = (MapAggBuffer) agg;
+            return myagg.collectMap;
+        }
+
+        @Override
+        public Object terminate(@SuppressWarnings("deprecation") AggregationBuffer agg)
+                throws HiveException {
+            MapAggBuffer myagg = (MapAggBuffer) agg;
+            return myagg.collectMap;
+        }
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/mapred/RowNumberUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/mapred/RowNumberUDF.java b/core/src/main/java/hivemall/tools/mapred/RowNumberUDF.java
index 3c92e30..95c97dc 100644
--- a/core/src/main/java/hivemall/tools/mapred/RowNumberUDF.java
+++ b/core/src/main/java/hivemall/tools/mapred/RowNumberUDF.java
@@ -28,8 +28,8 @@ import org.apache.hadoop.hive.ql.metadata.HiveException;
 import org.apache.hadoop.hive.ql.udf.UDFType;
 import org.apache.hadoop.io.LongWritable;
 
-@Description(name = "rownum", value = "_FUNC_() - Returns a generated row number in long",
-        extended = "returns sprintf(`%d%04d`,sequence,taskId) as long")
+@Description(name = "rownum", value = "_FUNC_() - Returns a generated row number `sprintf(`%d%04d`,sequence,taskId)` in long",
+        extended = "SELECT rownum() as rownum, xxx from ...")
 @UDFType(deterministic = false, stateful = true)
 public final class RowNumberUDF extends UDF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/sanity/AssertUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/sanity/AssertUDF.java b/core/src/main/java/hivemall/tools/sanity/AssertUDF.java
index d34cd20..c74aeb8 100644
--- a/core/src/main/java/hivemall/tools/sanity/AssertUDF.java
+++ b/core/src/main/java/hivemall/tools/sanity/AssertUDF.java
@@ -25,8 +25,10 @@ import org.apache.hadoop.hive.ql.udf.UDFType;
 
 @Description(name = "assert",
         value = "_FUNC_(boolean condition) or _FUNC_(boolean condition, string errMsg)"
-                + "- Throws HiveException if condition is not met")
-@UDFType(deterministic = true, stateful = false)
+                + "- Throws HiveException if condition is not met",
+        extended = "SELECT count(1) FROM stock_price WHERE assert(price > 0.0);\n"
+                + "SELECT count(1) FROM stock_price WHERE assert(price > 0.0, 'price MUST be more than 0.0')")
+@UDFType(deterministic = false, stateful = false)
 public final class AssertUDF extends UDF {
 
     public boolean evaluate(boolean condition) throws HiveException {

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/sanity/RaiseErrorUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/sanity/RaiseErrorUDF.java b/core/src/main/java/hivemall/tools/sanity/RaiseErrorUDF.java
index 194085c..fb6b8eb 100644
--- a/core/src/main/java/hivemall/tools/sanity/RaiseErrorUDF.java
+++ b/core/src/main/java/hivemall/tools/sanity/RaiseErrorUDF.java
@@ -18,21 +18,48 @@
  */
 package hivemall.tools.sanity;
 
+import org.apache.commons.lang.StringUtils;
 import org.apache.hadoop.hive.ql.exec.Description;
-import org.apache.hadoop.hive.ql.exec.UDF;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
 import org.apache.hadoop.hive.ql.metadata.HiveException;
 import org.apache.hadoop.hive.ql.udf.UDFType;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
 
-@Description(name = "raise_error", value = "_FUNC_() or _FUNC_(string msg) - Throws an error")
-@UDFType(deterministic = true, stateful = false)
-public final class RaiseErrorUDF extends UDF {
+@Description(name = "raise_error", value = "_FUNC_() or _FUNC_(string msg) - Throws an error",
+        extended = "SELECT product_id, price, raise_error('Found an invalid record') FROM xxx WHERE price < 0.0")
+@UDFType(deterministic = false, stateful = false)
+public class RaiseErrorUDF extends GenericUDF {
 
-    public boolean evaluate() throws HiveException {
-        throw new HiveException();
+    @Override
+    public ObjectInspector initialize(ObjectInspector[] argOIs) throws UDFArgumentException {
+        if (argOIs.length != 0 && argOIs.length != 1) {
+            throw new UDFArgumentLengthException(
+                "Expected one or two arguments for raise_error UDF: " + argOIs.length);
+        }
+
+        return PrimitiveObjectInspectorFactory.writableBooleanObjectInspector;
+    }
+
+    @Override
+    public Object evaluate(DeferredObject[] arguments) throws HiveException {
+        if (arguments.length == 1) {
+            Object arg0 = arguments[0].get();
+            if (arg0 == null) {
+                throw new HiveException();
+            }
+            String msg = arg0.toString();
+            throw new HiveException(msg);
+        } else {
+            throw new HiveException();
+        }
     }
 
-    public boolean evaluate(String errorMessage) throws HiveException {
-        throw new HiveException(errorMessage);
+    @Override
+    public String getDisplayString(String[] children) {
+        return "raise_error(" + StringUtils.join(children, ',') + ')';
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/text/Base91UDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/text/Base91UDF.java b/core/src/main/java/hivemall/tools/text/Base91UDF.java
index 6f52599..73f365b 100644
--- a/core/src/main/java/hivemall/tools/text/Base91UDF.java
+++ b/core/src/main/java/hivemall/tools/text/Base91UDF.java
@@ -40,7 +40,7 @@ import org.apache.hadoop.io.Text;
 
 @Description(name = "base91",
         value = "_FUNC_(BINARY bin) - Convert the argument from binary to a BASE91 string",
-        extended = "select base91(deflate('aaaaaaaaaaaaaaaabbbbccc'));\n" + "> AA+=kaIM|WTt!+wbGAA")
+        extended = "SELECT base91(deflate('aaaaaaaaaaaaaaaabbbbccc'));\n" + " AA+=kaIM|WTt!+wbGAA")
 @UDFType(deterministic = true, stateful = false)
 public final class Base91UDF extends GenericUDF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/text/NormalizeUnicodeUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/text/NormalizeUnicodeUDF.java b/core/src/main/java/hivemall/tools/text/NormalizeUnicodeUDF.java
index aefb4e2..9a7b547 100644
--- a/core/src/main/java/hivemall/tools/text/NormalizeUnicodeUDF.java
+++ b/core/src/main/java/hivemall/tools/text/NormalizeUnicodeUDF.java
@@ -29,8 +29,8 @@ import org.apache.hadoop.hive.ql.udf.UDFType;
 @Description(name = "normalize_unicode",
         value = "_FUNC_(string str [, string form]) - Transforms `str` with the specified normalization form. "
                 + "The `form` takes one of NFC (default), NFD, NFKC, or NFKD",
-        extended = "select normalize_unicode('ハンカクカナ','NFKC');\n" + "> ハンカクカナ\n" + "\n"
-                + "select normalize_unicode('㈱㌧㌦Ⅲ','NFKC');\n" + "> (株)トンドルIII")
+        extended = "SELECT normalize_unicode('ハンカクカナ','NFKC');\n" + " ハンカクカナ\n" + "\n"
+                + "SELECT normalize_unicode('㈱㌧㌦Ⅲ','NFKC');\n" + " (株)トンドルIII")
 @UDFType(deterministic = true, stateful = false)
 public final class NormalizeUnicodeUDF extends UDF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/text/SingularizeUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/text/SingularizeUDF.java b/core/src/main/java/hivemall/tools/text/SingularizeUDF.java
index 73d2d63..3b16828 100644
--- a/core/src/main/java/hivemall/tools/text/SingularizeUDF.java
+++ b/core/src/main/java/hivemall/tools/text/SingularizeUDF.java
@@ -40,7 +40,7 @@ import org.apache.hadoop.hive.ql.udf.UDFType;
 //  https://github.com/clips/pattern/blob/3eef00481a4555331cf9a099308910d977f6fc22/pattern/text/en/inflect.py#L445-L623
 @Description(name = "singularize",
         value = "_FUNC_(string word) - Returns singular form of a given English word",
-        extended = "select singularize(lower(\"Apples\"));\n" + "\n" + "> \"apple\"")
+        extended = "SELECT singularize(lower(\"Apples\"));\n" + "\n" + " \"apple\"")
 @UDFType(deterministic = true, stateful = false)
 public final class SingularizeUDF extends UDF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/text/SplitWordsUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/text/SplitWordsUDF.java b/core/src/main/java/hivemall/tools/text/SplitWordsUDF.java
index 0b10c2f..31d155d 100644
--- a/core/src/main/java/hivemall/tools/text/SplitWordsUDF.java
+++ b/core/src/main/java/hivemall/tools/text/SplitWordsUDF.java
@@ -28,7 +28,7 @@ import org.apache.hadoop.hive.ql.udf.UDFType;
 import org.apache.hadoop.io.Text;
 
 @Description(name = "split_words",
-        value = "_FUNC_(string query [, string regex]) - Returns an array<text> containing split strings")
+        value = "_FUNC_(string query [, string regex]) - Returns an array<text> containing splitted strings")
 @UDFType(deterministic = true, stateful = false)
 public final class SplitWordsUDF extends UDF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/text/Unbase91UDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/text/Unbase91UDF.java b/core/src/main/java/hivemall/tools/text/Unbase91UDF.java
index a96b3bf..9c277ce 100644
--- a/core/src/main/java/hivemall/tools/text/Unbase91UDF.java
+++ b/core/src/main/java/hivemall/tools/text/Unbase91UDF.java
@@ -39,8 +39,8 @@ import org.apache.hadoop.io.BytesWritable;
 import org.apache.hadoop.io.Text;
 
 @Description(name = "unbase91", value = "_FUNC_(string) - Convert a BASE91 string to a binary",
-        extended = "select inflate(unbase91(base91(deflate('aaaaaaaaaaaaaaaabbbbccc'))));\n"
-                + "> aaaaaaaaaaaaaaaabbbbccc")
+        extended = "SELECT inflate(unbase91(base91(deflate('aaaaaaaaaaaaaaaabbbbccc'))));\n"
+                + " aaaaaaaaaaaaaaaabbbbccc")
 @UDFType(deterministic = true, stateful = false)
 public final class Unbase91UDF extends GenericUDF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/text/WordNgramsUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/text/WordNgramsUDF.java b/core/src/main/java/hivemall/tools/text/WordNgramsUDF.java
index fa8308b..9b3658f 100644
--- a/core/src/main/java/hivemall/tools/text/WordNgramsUDF.java
+++ b/core/src/main/java/hivemall/tools/text/WordNgramsUDF.java
@@ -37,8 +37,8 @@ import java.util.List;
 @Description(name = "word_ngrams",
         value = "_FUNC_(array<string> words, int minSize, int maxSize])"
                 + " - Returns list of n-grams for given words, where `minSize <= n <= maxSize`",
-        extended = "select word_ngrams(tokenize('Machine learning is fun!', true), 1, 2);\n" + "\n"
-                + "> [\"machine\",\"machine learning\",\"learning\",\"learning is\",\"is\",\"is fun\",\"fun\"]")
+        extended = "SELECT word_ngrams(tokenize('Machine learning is fun!', true), 1, 2);\n" + "\n"
+                + " [\"machine\",\"machine learning\",\"learning\",\"learning is\",\"is\",\"is fun\",\"fun\"]")
 @UDFType(deterministic = true, stateful = false)
 public final class WordNgramsUDF extends UDF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/timeseries/MovingAverageUDTF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/timeseries/MovingAverageUDTF.java b/core/src/main/java/hivemall/tools/timeseries/MovingAverageUDTF.java
new file mode 100644
index 0000000..b5267a1
--- /dev/null
+++ b/core/src/main/java/hivemall/tools/timeseries/MovingAverageUDTF.java
@@ -0,0 +1,98 @@
+/*
+ * 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 hivemall.tools.timeseries;
+
+import hivemall.utils.hadoop.HiveUtils;
+import hivemall.utils.stats.MovingAverage;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.hadoop.hive.ql.exec.Description;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.udf.UDFType;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
+import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
+import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
+import org.apache.hadoop.io.Writable;
+
+// @formatter:off
+@Description(name = "moving_avg",
+        value = "_FUNC_(NUMBER value, const int windowSize)"
+                + " - Returns moving average of a time series using a given window",
+        extended = "SELECT moving_avg(x, 3) FROM (SELECT explode(array(1.0,2.0,3.0,4.0,5.0,6.0,7.0)) as x) series;\n" +
+                " 1.0\n" + 
+                " 1.5\n" + 
+                " 2.0\n" + 
+                " 3.0\n" + 
+                " 4.0\n" + 
+                " 5.0\n" + 
+                " 6.0")
+// @formatter:on
+@UDFType(deterministic = false, stateful = true)
+public final class MovingAverageUDTF extends GenericUDTF {
+
+    private PrimitiveObjectInspector valueOI;
+
+    private MovingAverage movingAvg;
+
+    private Writable[] forwardObjs;
+    private DoubleWritable result;
+
+    @Override
+    public StructObjectInspector initialize(ObjectInspector[] argOIs) throws UDFArgumentException {
+        if (argOIs.length != 2) {
+            throw new UDFArgumentException(
+                "Two argument is expected for moving_avg(NUMBER value, const int windowSize): "
+                        + argOIs.length);
+        }
+        this.valueOI = HiveUtils.asNumberOI(argOIs[0]);
+
+        int windowSize = HiveUtils.getConstInt(argOIs[1]);
+        this.movingAvg = new MovingAverage(windowSize);
+
+        this.result = new DoubleWritable();
+        this.forwardObjs = new Writable[] {result};
+
+        List<String> fieldNames = Arrays.asList("avg");
+        List<ObjectInspector> fieldOIs = Arrays.<ObjectInspector>asList(
+            PrimitiveObjectInspectorFactory.writableDoubleObjectInspector);
+
+        return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
+    }
+
+    @Override
+    public void process(Object[] args) throws HiveException {
+        double x = HiveUtils.getDouble(args[0], valueOI);
+
+        double avg = movingAvg.add(x);
+        result.set(avg);
+
+        forward(forwardObjs);
+    }
+
+    @Override
+    public void close() throws HiveException {}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/vector/VectorAddUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/vector/VectorAddUDF.java b/core/src/main/java/hivemall/tools/vector/VectorAddUDF.java
index 8442ae3..98fab99 100644
--- a/core/src/main/java/hivemall/tools/vector/VectorAddUDF.java
+++ b/core/src/main/java/hivemall/tools/vector/VectorAddUDF.java
@@ -42,7 +42,8 @@ import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectIn
 import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils;
 
 @Description(name = "vector_add",
-        value = "_FUNC_(array<NUMBER> x, array<NUMBER> y) - Perform vector ADD operation.")
+        value = "_FUNC_(array<NUMBER> x, array<NUMBER> y) - Perform vector ADD operation.",
+        extended = "SELECT vector_add(array(1.0,2.0,3.0), array(2, 3, 4));\n" + "[3.0,5.0,7.0]")
 @UDFType(deterministic = true, stateful = false)
 public final class VectorAddUDF extends GenericUDF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/vector/VectorDotUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/vector/VectorDotUDF.java b/core/src/main/java/hivemall/tools/vector/VectorDotUDF.java
index 2aa3c03..b43b562 100644
--- a/core/src/main/java/hivemall/tools/vector/VectorDotUDF.java
+++ b/core/src/main/java/hivemall/tools/vector/VectorDotUDF.java
@@ -43,7 +43,8 @@ import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectIn
 
 @Description(name = "vector_dot",
         value = "_FUNC_(array<NUMBER> x, array<NUMBER> y) - Performs vector dot product.",
-        extended = "_FUNC_(array<NUMBER> x, NUMBER y) - Performs vector multiplication")
+        extended = "SELECT vector_dot(array(1.0,2.0,3.0),array(2.0,3.0,4.0));\n20\n\n"
+                + "SELECT vector_dot(array(1.0,2.0,3.0),2);\n[2.0,4.0,6.0]")
 @UDFType(deterministic = true, stateful = false)
 public final class VectorDotUDF extends GenericUDF {
 
@@ -65,19 +66,19 @@ public final class VectorDotUDF extends GenericUDF {
         ObjectInspector argOI1 = argOIs[1];
         if (HiveUtils.isNumberListOI(argOI1)) {
             this.evaluator = new Dot2DVectors(xListOI, HiveUtils.asListOI(argOI1));
+            return PrimitiveObjectInspectorFactory.javaDoubleObjectInspector;
         } else if (HiveUtils.isNumberOI(argOI1)) {
             this.evaluator = new Multiply2D1D(xListOI, argOI1);
+            return ObjectInspectorFactory.getStandardListObjectInspector(
+                PrimitiveObjectInspectorFactory.javaDoubleObjectInspector);
         } else {
             throw new UDFArgumentException(
                 "Expected array<number> or number for the send argument: " + argOI1.getTypeName());
         }
-
-        return ObjectInspectorFactory.getStandardListObjectInspector(
-            PrimitiveObjectInspectorFactory.javaDoubleObjectInspector);
     }
 
     @Override
-    public List<Double> evaluate(DeferredObject[] args) throws HiveException {
+    public Object evaluate(DeferredObject[] args) throws HiveException {
         final Object arg0 = args[0].get();
         final Object arg1 = args[1].get();
         if (arg0 == null || arg1 == null) {
@@ -90,7 +91,7 @@ public final class VectorDotUDF extends GenericUDF {
     interface Evaluator extends Serializable {
 
         @Nonnull
-        List<Double> dot(@Nonnull Object x, @Nonnull Object y) throws HiveException;
+        Object dot(@Nonnull Object x, @Nonnull Object y) throws HiveException;
 
     }
 
@@ -144,7 +145,7 @@ public final class VectorDotUDF extends GenericUDF {
         }
 
         @Override
-        public List<Double> dot(@Nonnull Object x, @Nonnull Object y) throws HiveException {
+        public Double dot(@Nonnull Object x, @Nonnull Object y) throws HiveException {
             final int xLen = xListOI.getListLength(x);
             final int yLen = yListOI.getListLength(y);
             if (xLen != yLen) {
@@ -152,7 +153,7 @@ public final class VectorDotUDF extends GenericUDF {
                         + ", y=" + yListOI.getList(y));
             }
 
-            final Double[] arr = new Double[xLen];
+            double result = 0.d;
             for (int i = 0; i < xLen; i++) {
                 Object xi = xListOI.getListElement(x, i);
                 Object yi = yListOI.getListElement(y, i);
@@ -162,10 +163,10 @@ public final class VectorDotUDF extends GenericUDF {
                 double xd = PrimitiveObjectInspectorUtils.getDouble(xi, xElemOI);
                 double yd = PrimitiveObjectInspectorUtils.getDouble(yi, yElemOI);
                 double v = xd * yd;
-                arr[i] = Double.valueOf(v);
+                result += v;
             }
 
-            return Arrays.asList(arr);
+            return Double.valueOf(result);
         }
 
     }

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/utils/hadoop/HiveUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/utils/hadoop/HiveUtils.java b/core/src/main/java/hivemall/utils/hadoop/HiveUtils.java
index f3fe703..12b0e97 100644
--- a/core/src/main/java/hivemall/utils/hadoop/HiveUtils.java
+++ b/core/src/main/java/hivemall/utils/hadoop/HiveUtils.java
@@ -1211,7 +1211,7 @@ public final class HiveUtils {
 
     @Nonnull
     public static ObjectInspector getObjectInspector(@Nonnull final String typeString,
-            boolean preferWritable) {
+            final boolean preferWritable) {
         TypeInfo typeInfo = TypeInfoUtils.getTypeInfoFromTypeString(typeString);
         if (preferWritable) {
             return TypeInfoUtils.getStandardWritableObjectInspectorFromTypeInfo(typeInfo);

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/utils/math/MatrixUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/utils/math/MatrixUtils.java b/core/src/main/java/hivemall/utils/math/MatrixUtils.java
index 6c08a61..38329c1 100644
--- a/core/src/main/java/hivemall/utils/math/MatrixUtils.java
+++ b/core/src/main/java/hivemall/utils/math/MatrixUtils.java
@@ -239,7 +239,6 @@ public final class MatrixUtils {
         Preconditions.checkArgument(dim >= 1, "Invalid dimension: " + dim);
         Preconditions.checkArgument(c.length >= dim,
             "|c| must be greater than " + dim + ": " + c.length);
-
         /*
          * Toeplitz matrix  (symmetric, invertible, k*dimensions by k*dimensions)
          *
@@ -511,8 +510,12 @@ public final class MatrixUtils {
     }
 
     /**
-     * Find the first singular vector/value of a matrix A based on the Power method.
+     * Find the first singular vector/value of a matrix A based on the Power method. <<<<<<< HEAD
      *
+     * =======
+     * 
+     * >>>>>>> Applied spotless-maven-plugin formatter
+     * 
      * @see http
      *      ://www.cs.yale.edu/homes/el327/datamining2013aFiles/07_singular_value_decomposition.pdf
      * @param A target matrix

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/test/java/hivemall/fm/FieldAwareFactorizationMachineUDTFTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/hivemall/fm/FieldAwareFactorizationMachineUDTFTest.java b/core/src/test/java/hivemall/fm/FieldAwareFactorizationMachineUDTFTest.java
index 16196eb..5b7aa8f 100644
--- a/core/src/test/java/hivemall/fm/FieldAwareFactorizationMachineUDTFTest.java
+++ b/core/src/test/java/hivemall/fm/FieldAwareFactorizationMachineUDTFTest.java
@@ -85,6 +85,7 @@ public class FieldAwareFactorizationMachineUDTFTest {
 
     @Test
     public void testSample() throws IOException, HiveException {
+        System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2");
         run("[Sample.ffm] default option",
             "https://github.com/myui/ml_dataset/raw/master/ffm/sample.ffm.gz",
             "-classification -factors 2 -iters 10 -feature_hashing 20 -seed 43", 0.01f);
@@ -92,6 +93,7 @@ public class FieldAwareFactorizationMachineUDTFTest {
 
     // TODO @Test
     public void testSampleEnableNorm() throws IOException, HiveException {
+        System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2");
         run("[Sample.ffm] default option",
             "https://github.com/myui/ml_dataset/raw/master/ffm/sample.ffm.gz",
             "-classification -factors 2 -iters 10 -feature_hashing 20 -seed 43 -enable_norm",

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/test/java/hivemall/ftvec/hashing/FeatureHashingUDFTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/hivemall/ftvec/hashing/FeatureHashingUDFTest.java b/core/src/test/java/hivemall/ftvec/hashing/FeatureHashingUDFTest.java
index d91eb66..06277c2 100644
--- a/core/src/test/java/hivemall/ftvec/hashing/FeatureHashingUDFTest.java
+++ b/core/src/test/java/hivemall/ftvec/hashing/FeatureHashingUDFTest.java
@@ -21,6 +21,9 @@ package hivemall.ftvec.hashing;
 import hivemall.TestUtils;
 import hivemall.utils.hashing.MurmurHash3;
 
+import java.io.IOException;
+import java.util.Arrays;
+
 import org.apache.hadoop.hive.ql.metadata.HiveException;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
@@ -29,9 +32,6 @@ import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectIn
 import org.junit.Assert;
 import org.junit.Test;
 
-import java.io.IOException;
-import java.util.Arrays;
-
 public class FeatureHashingUDFTest {
 
     @Test

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/test/java/hivemall/smile/classification/DecisionTreeTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/hivemall/smile/classification/DecisionTreeTest.java b/core/src/test/java/hivemall/smile/classification/DecisionTreeTest.java
index 018de82..b789e71 100644
--- a/core/src/test/java/hivemall/smile/classification/DecisionTreeTest.java
+++ b/core/src/test/java/hivemall/smile/classification/DecisionTreeTest.java
@@ -19,6 +19,7 @@
 package hivemall.smile.classification;
 
 import static org.junit.Assert.assertEquals;
+
 import hivemall.math.matrix.Matrix;
 import hivemall.math.matrix.builders.CSRMatrixBuilder;
 import hivemall.math.matrix.dense.RowMajorDenseMatrix2d;
@@ -29,6 +30,10 @@ import hivemall.smile.tools.TreeExportUDF.Evaluator;
 import hivemall.smile.tools.TreeExportUDF.OutputType;
 import hivemall.smile.utils.SmileExtUtils;
 import hivemall.utils.codec.Base91;
+import smile.data.AttributeDataset;
+import smile.data.parser.ArffParser;
+import smile.math.Math;
+import smile.validation.LOOCV;
 
 import java.io.BufferedInputStream;
 import java.io.IOException;
@@ -43,11 +48,6 @@ import org.apache.hadoop.io.Text;
 import org.junit.Assert;
 import org.junit.Test;
 
-import smile.data.AttributeDataset;
-import smile.data.parser.ArffParser;
-import smile.math.Math;
-import smile.validation.LOOCV;
-
 public class DecisionTreeTest {
     private static final boolean DEBUG = false;
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/test/java/hivemall/smile/regression/RegressionTreeTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/hivemall/smile/regression/RegressionTreeTest.java b/core/src/test/java/hivemall/smile/regression/RegressionTreeTest.java
index a4a7f05..9d24b54 100644
--- a/core/src/test/java/hivemall/smile/regression/RegressionTreeTest.java
+++ b/core/src/test/java/hivemall/smile/regression/RegressionTreeTest.java
@@ -27,6 +27,8 @@ import hivemall.smile.data.Attribute.NumericAttribute;
 import hivemall.smile.tools.TreeExportUDF.Evaluator;
 import hivemall.smile.tools.TreeExportUDF.OutputType;
 import hivemall.utils.codec.Base91;
+import smile.math.Math;
+import smile.validation.LOOCV;
 
 import java.io.IOException;
 import java.text.ParseException;
@@ -39,9 +41,6 @@ import org.apache.hadoop.io.Text;
 import org.junit.Assert;
 import org.junit.Test;
 
-import smile.math.Math;
-import smile.validation.LOOCV;
-
 public class RegressionTreeTest {
     private static final boolean DEBUG = false;
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/test/java/hivemall/statistics/MovingAverageUDTFTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/hivemall/statistics/MovingAverageUDTFTest.java b/core/src/test/java/hivemall/statistics/MovingAverageUDTFTest.java
deleted file mode 100644
index e755e26..0000000
--- a/core/src/test/java/hivemall/statistics/MovingAverageUDTFTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * 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 hivemall.statistics;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import hivemall.TestUtils;
-import org.apache.hadoop.hive.ql.metadata.HiveException;
-import org.apache.hadoop.hive.ql.udf.generic.Collector;
-import org.apache.hadoop.hive.serde2.io.DoubleWritable;
-import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
-import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
-import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class MovingAverageUDTFTest {
-
-    @Test
-    public void test() throws HiveException {
-        MovingAverageUDTF udtf = new MovingAverageUDTF();
-
-        ObjectInspector argOI0 = PrimitiveObjectInspectorFactory.javaFloatObjectInspector;
-        ObjectInspector argOI1 = ObjectInspectorUtils.getConstantObjectInspector(
-            PrimitiveObjectInspectorFactory.javaIntObjectInspector, 3);
-
-        final List<Double> results = new ArrayList<>();
-        udtf.initialize(new ObjectInspector[] {argOI0, argOI1});
-        udtf.setCollector(new Collector() {
-            @Override
-            public void collect(Object input) throws HiveException {
-                Object[] objs = (Object[]) input;
-                Assert.assertEquals(1, objs.length);
-                Assert.assertTrue(objs[0] instanceof DoubleWritable);
-                double x = ((DoubleWritable) objs[0]).get();
-                results.add(x);
-            }
-        });
-
-        udtf.process(new Object[] {1.f, null});
-        udtf.process(new Object[] {2.f, null});
-        udtf.process(new Object[] {3.f, null});
-        udtf.process(new Object[] {4.f, null});
-        udtf.process(new Object[] {5.f, null});
-        udtf.process(new Object[] {6.f, null});
-        udtf.process(new Object[] {7.f, null});
-
-        Assert.assertEquals(Arrays.asList(1.d, 1.5d, 2.d, 3.d, 4.d, 5.d, 6.d), results);
-    }
-
-    @Test
-    public void testSerialization() throws HiveException {
-        TestUtils.testGenericUDTFSerialization(MovingAverageUDTF.class,
-            new ObjectInspector[] {PrimitiveObjectInspectorFactory.javaFloatObjectInspector,
-                    ObjectInspectorUtils.getConstantObjectInspector(
-                        PrimitiveObjectInspectorFactory.javaIntObjectInspector, 3)},
-            new Object[][] {{1.f}, {2.f}, {3.f}, {4.f}, {5.f}});
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/test/java/hivemall/tools/GenerateSeriesUDTFTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/hivemall/tools/GenerateSeriesUDTFTest.java b/core/src/test/java/hivemall/tools/GenerateSeriesUDTFTest.java
new file mode 100644
index 0000000..04f432c
--- /dev/null
+++ b/core/src/test/java/hivemall/tools/GenerateSeriesUDTFTest.java
@@ -0,0 +1,246 @@
+/*
+ * 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 hivemall.tools;
+
+import hivemall.TestUtils;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.udf.generic.Collector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
+import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
+import org.apache.hadoop.io.IntWritable;
+import org.apache.hadoop.io.LongWritable;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class GenerateSeriesUDTFTest {
+
+    @Test
+    public void testTwoConstArgs() throws HiveException {
+        GenerateSeriesUDTF udtf = new GenerateSeriesUDTF();
+
+        udtf.initialize(new ObjectInspector[] {
+                PrimitiveObjectInspectorFactory.getPrimitiveWritableConstantObjectInspector(
+                    TypeInfoFactory.intTypeInfo, new IntWritable(1)),
+                PrimitiveObjectInspectorFactory.getPrimitiveWritableConstantObjectInspector(
+                    TypeInfoFactory.intTypeInfo, new IntWritable(3))});
+
+        final List<IntWritable> actual = new ArrayList<>();
+
+        udtf.setCollector(new Collector() {
+            @Override
+            public void collect(Object args) throws HiveException {
+                Object[] row = (Object[]) args;
+                IntWritable row0 = (IntWritable) row[0];
+                actual.add(new IntWritable(row0.get()));
+            }
+        });
+
+        udtf.process(new Object[] {new IntWritable(1), new IntWritable(3)});
+
+        List<IntWritable> expected =
+                Arrays.asList(new IntWritable(1), new IntWritable(2), new IntWritable(3));
+        Assert.assertEquals(expected, actual);
+    }
+
+    @Test
+    public void testTwoIntArgs() throws HiveException {
+        GenerateSeriesUDTF udtf = new GenerateSeriesUDTF();
+
+        udtf.initialize(
+            new ObjectInspector[] {PrimitiveObjectInspectorFactory.javaIntObjectInspector,
+                    PrimitiveObjectInspectorFactory.writableIntObjectInspector});
+
+        final List<IntWritable> actual = new ArrayList<>();
+
+        udtf.setCollector(new Collector() {
+            @Override
+            public void collect(Object args) throws HiveException {
+                Object[] row = (Object[]) args;
+                IntWritable row0 = (IntWritable) row[0];
+                actual.add(new IntWritable(row0.get()));
+            }
+        });
+
+        udtf.process(new Object[] {1, new IntWritable(3)});
+
+        List<IntWritable> expected =
+                Arrays.asList(new IntWritable(1), new IntWritable(2), new IntWritable(3));
+        Assert.assertEquals(expected, actual);
+    }
+
+    @Test
+    public void testTwoLongArgs() throws HiveException {
+        GenerateSeriesUDTF udtf = new GenerateSeriesUDTF();
+
+        udtf.initialize(
+            new ObjectInspector[] {PrimitiveObjectInspectorFactory.javaIntObjectInspector,
+                    PrimitiveObjectInspectorFactory.writableLongObjectInspector});
+
+        final List<LongWritable> actual = new ArrayList<>();
+
+        udtf.setCollector(new Collector() {
+            @Override
+            public void collect(Object args) throws HiveException {
+                Object[] row = (Object[]) args;
+                LongWritable row0 = (LongWritable) row[0];
+                actual.add(new LongWritable(row0.get()));
+            }
+        });
+
+        udtf.process(new Object[] {1, new LongWritable(3)});
+
+        List<LongWritable> expected =
+                Arrays.asList(new LongWritable(1), new LongWritable(2), new LongWritable(3));
+        Assert.assertEquals(expected, actual);
+    }
+
+    @Test
+    public void testThreeIntArgs() throws HiveException {
+        GenerateSeriesUDTF udtf = new GenerateSeriesUDTF();
+
+        udtf.initialize(
+            new ObjectInspector[] {PrimitiveObjectInspectorFactory.javaIntObjectInspector,
+                    PrimitiveObjectInspectorFactory.writableIntObjectInspector,
+                    PrimitiveObjectInspectorFactory.javaLongObjectInspector});
+
+        final List<IntWritable> actual = new ArrayList<>();
+
+        udtf.setCollector(new Collector() {
+            @Override
+            public void collect(Object args) throws HiveException {
+                Object[] row = (Object[]) args;
+                IntWritable row0 = (IntWritable) row[0];
+                actual.add(new IntWritable(row0.get()));
+            }
+        });
+
+        udtf.process(new Object[] {1, new IntWritable(7), 3L});
+
+        List<IntWritable> expected =
+                Arrays.asList(new IntWritable(1), new IntWritable(4), new IntWritable(7));
+        Assert.assertEquals(expected, actual);
+    }
+
+    @Test
+    public void testThreeLongArgs() throws HiveException {
+        GenerateSeriesUDTF udtf = new GenerateSeriesUDTF();
+
+        udtf.initialize(
+            new ObjectInspector[] {PrimitiveObjectInspectorFactory.javaLongObjectInspector,
+                    PrimitiveObjectInspectorFactory.writableLongObjectInspector,
+                    PrimitiveObjectInspectorFactory.javaLongObjectInspector});
+
+        final List<LongWritable> actual = new ArrayList<>();
+
+        udtf.setCollector(new Collector() {
+            @Override
+            public void collect(Object args) throws HiveException {
+                Object[] row = (Object[]) args;
+                LongWritable row0 = (LongWritable) row[0];
+                actual.add(new LongWritable(row0.get()));
+            }
+        });
+
+        udtf.process(new Object[] {1L, new LongWritable(7), 3L});
+
+        List<LongWritable> expected =
+                Arrays.asList(new LongWritable(1), new LongWritable(4), new LongWritable(7));
+        Assert.assertEquals(expected, actual);
+    }
+
+    @Test
+    public void testNegativeStepInt() throws HiveException {
+        GenerateSeriesUDTF udtf = new GenerateSeriesUDTF();
+
+        udtf.initialize(
+            new ObjectInspector[] {PrimitiveObjectInspectorFactory.javaIntObjectInspector,
+                    PrimitiveObjectInspectorFactory.writableIntObjectInspector,
+                    PrimitiveObjectInspectorFactory.javaLongObjectInspector});
+
+        final List<IntWritable> actual = new ArrayList<>();
+
+        udtf.setCollector(new Collector() {
+            @Override
+            public void collect(Object args) throws HiveException {
+                Object[] row = (Object[]) args;
+                IntWritable row0 = (IntWritable) row[0];
+                actual.add(new IntWritable(row0.get()));
+            }
+        });
+
+        udtf.process(new Object[] {5, new IntWritable(1), -2L});
+
+        List<IntWritable> expected =
+                Arrays.asList(new IntWritable(5), new IntWritable(3), new IntWritable(1));
+        Assert.assertEquals(expected, actual);
+    }
+
+    @Test
+    public void testNegativeStepLong() throws HiveException {
+        GenerateSeriesUDTF udtf = new GenerateSeriesUDTF();
+
+        udtf.initialize(
+            new ObjectInspector[] {PrimitiveObjectInspectorFactory.javaLongObjectInspector,
+                    PrimitiveObjectInspectorFactory.writableIntObjectInspector,
+                    PrimitiveObjectInspectorFactory.javaIntObjectInspector});
+
+        final List<LongWritable> actual = new ArrayList<>();
+
+        udtf.setCollector(new Collector() {
+            @Override
+            public void collect(Object args) throws HiveException {
+                Object[] row = (Object[]) args;
+                LongWritable row0 = (LongWritable) row[0];
+                actual.add(new LongWritable(row0.get()));
+            }
+        });
+
+        udtf.process(new Object[] {5L, new IntWritable(1), -2});
+
+        List<LongWritable> expected =
+                Arrays.asList(new LongWritable(5), new LongWritable(3), new LongWritable(1));
+        Assert.assertEquals(expected, actual);
+    }
+
+    @Test
+    public void testSerialization() throws HiveException {
+        GenerateSeriesUDTF udtf = new GenerateSeriesUDTF();
+
+        udtf.initialize(
+            new ObjectInspector[] {PrimitiveObjectInspectorFactory.javaIntObjectInspector,
+                    PrimitiveObjectInspectorFactory.writableIntObjectInspector});
+
+        udtf.setCollector(new Collector() {
+            @Override
+            public void collect(Object args) throws HiveException {}
+        });
+
+        udtf.process(new Object[] {1, new IntWritable(3)});
+
+        byte[] serialized = TestUtils.serializeObjectByKryo(udtf);
+        TestUtils.deserializeObjectByKryo(serialized, GenerateSeriesUDTF.class);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/test/java/hivemall/tools/array/ArrayAppendUDFTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/hivemall/tools/array/ArrayAppendUDFTest.java b/core/src/test/java/hivemall/tools/array/ArrayAppendUDFTest.java
index b376abe..1e01274 100644
--- a/core/src/test/java/hivemall/tools/array/ArrayAppendUDFTest.java
+++ b/core/src/test/java/hivemall/tools/array/ArrayAppendUDFTest.java
@@ -85,22 +85,21 @@ public class ArrayAppendUDFTest {
         udf.close();
     }
 
-
     @Test
-    public void testEvaluateReturnNull() throws HiveException, IOException {
+    public void testEvaluateNullList() throws HiveException, IOException {
         ArrayAppendUDF udf = new ArrayAppendUDF();
 
         udf.initialize(new ObjectInspector[] {
                 ObjectInspectorFactory.getStandardListObjectInspector(
-                    PrimitiveObjectInspectorFactory.javaDoubleObjectInspector),
+                    PrimitiveObjectInspectorFactory.writableDoubleObjectInspector),
                 PrimitiveObjectInspectorFactory.javaDoubleObjectInspector});
 
         DeferredObject[] args = new DeferredObject[] {new GenericUDF.DeferredJavaObject(null),
-                new GenericUDF.DeferredJavaObject(new Double(3))};
+                new GenericUDF.DeferredJavaObject(new Double(3d))};
 
         List<Object> result = udf.evaluate(args);
 
-        Assert.assertNull(result);
+        Assert.assertEquals(Arrays.asList(new DoubleWritable(3d)), result);
 
         udf.close();
     }

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/test/java/hivemall/tools/array/ArrayFlattenUDFTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/hivemall/tools/array/ArrayFlattenUDFTest.java b/core/src/test/java/hivemall/tools/array/ArrayFlattenUDFTest.java
index f69cdd8..11754aa 100644
--- a/core/src/test/java/hivemall/tools/array/ArrayFlattenUDFTest.java
+++ b/core/src/test/java/hivemall/tools/array/ArrayFlattenUDFTest.java
@@ -18,11 +18,12 @@
  */
 package hivemall.tools.array;
 
+import hivemall.TestUtils;
+
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.List;
 
-import hivemall.TestUtils;
 import org.apache.hadoop.hive.ql.metadata.HiveException;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredObject;
@@ -64,4 +65,5 @@ public class ArrayFlattenUDFTest {
             new Object[] {Arrays.asList(Arrays.asList(0, 1, 2, 3), Arrays.asList(4, 5),
                 Arrays.asList(6, 7))});
     }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/test/java/hivemall/tools/array/ArraySliceUDFTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/hivemall/tools/array/ArraySliceUDFTest.java b/core/src/test/java/hivemall/tools/array/ArraySliceUDFTest.java
index a260936..fbc212a 100644
--- a/core/src/test/java/hivemall/tools/array/ArraySliceUDFTest.java
+++ b/core/src/test/java/hivemall/tools/array/ArraySliceUDFTest.java
@@ -18,12 +18,13 @@
  */
 package hivemall.tools.array;
 
+import hivemall.TestUtils;
+
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
-import hivemall.TestUtils;
 import org.apache.hadoop.hive.ql.metadata.HiveException;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredObject;
@@ -129,4 +130,5 @@ public class ArraySliceUDFTest {
             new Object[] {Arrays.asList("zero", "one", "two", "three", "four", "five", "six",
                 "seven", "eight", "nine", "ten"), 2, 5});
     }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/test/java/hivemall/tools/array/ArrayToStrUDFTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/hivemall/tools/array/ArrayToStrUDFTest.java b/core/src/test/java/hivemall/tools/array/ArrayToStrUDFTest.java
new file mode 100644
index 0000000..373217f
--- /dev/null
+++ b/core/src/test/java/hivemall/tools/array/ArrayToStrUDFTest.java
@@ -0,0 +1,103 @@
+/*
+ * 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 hivemall.tools.array;
+
+import hivemall.TestUtils;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredObject;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
+import org.apache.hadoop.io.Text;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ArrayToStrUDFTest {
+
+    @Test
+    public void testSimpleCase() throws HiveException, IOException {
+        ArrayToStrUDF udf = new ArrayToStrUDF();
+
+        udf.initialize(new ObjectInspector[] {
+                ObjectInspectorFactory.getStandardListObjectInspector(
+                    PrimitiveObjectInspectorFactory.javaIntObjectInspector),
+                PrimitiveObjectInspectorFactory.writableStringObjectInspector});
+
+        Text sep = new Text("#");
+        DeferredObject[] args =
+                new DeferredObject[] {new GenericUDF.DeferredJavaObject(Arrays.asList(1, 2, 3)),
+                        new GenericUDF.DeferredJavaObject(sep)};
+        Assert.assertEquals("1#2#3", udf.evaluate(args));
+
+        args = new DeferredObject[] {new GenericUDF.DeferredJavaObject(Arrays.asList(1, 2, 3)),
+                new GenericUDF.DeferredJavaObject(null)};
+        Assert.assertEquals("1,2,3", udf.evaluate(args));
+
+        udf.close();
+    }
+
+    @Test
+    public void testNoSep() throws HiveException, IOException {
+        ArrayToStrUDF udf = new ArrayToStrUDF();
+
+        udf.initialize(new ObjectInspector[] {ObjectInspectorFactory.getStandardListObjectInspector(
+            PrimitiveObjectInspectorFactory.javaIntObjectInspector)});
+
+        DeferredObject[] args =
+                new DeferredObject[] {new GenericUDF.DeferredJavaObject(Arrays.asList(1, 2, 3))};
+
+        Assert.assertEquals("1,2,3", udf.evaluate(args));
+
+        udf.close();
+    }
+
+    @Test
+    public void testNull() throws HiveException, IOException {
+        ArrayToStrUDF udf = new ArrayToStrUDF();
+
+        udf.initialize(new ObjectInspector[] {ObjectInspectorFactory.getStandardListObjectInspector(
+            PrimitiveObjectInspectorFactory.javaIntObjectInspector)});
+
+        DeferredObject[] args =
+                new DeferredObject[] {new GenericUDF.DeferredJavaObject(Arrays.asList(1, null, 3))};
+
+        Assert.assertEquals("1,3", udf.evaluate(args));
+
+        args = new DeferredObject[] {new GenericUDF.DeferredJavaObject(Arrays.asList(null, 2, 3))};
+
+        Assert.assertEquals("2,3", udf.evaluate(args));
+
+        udf.close();
+    }
+
+    @Test
+    public void testSerialization() throws HiveException, IOException {
+        TestUtils.testGenericUDFSerialization(ArrayToStrUDF.class,
+            new ObjectInspector[] {
+                    ObjectInspectorFactory.getStandardListObjectInspector(
+                        PrimitiveObjectInspectorFactory.javaIntObjectInspector),
+                    PrimitiveObjectInspectorFactory.javaStringObjectInspector},
+            new Object[] {Arrays.asList(1, 2, 3), "-"});
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/test/java/hivemall/tools/array/ArrayUnionUDFTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/hivemall/tools/array/ArrayUnionUDFTest.java b/core/src/test/java/hivemall/tools/array/ArrayUnionUDFTest.java
index ac0f735..cc17039 100644
--- a/core/src/test/java/hivemall/tools/array/ArrayUnionUDFTest.java
+++ b/core/src/test/java/hivemall/tools/array/ArrayUnionUDFTest.java
@@ -74,4 +74,5 @@ public class ArrayUnionUDFTest {
                         PrimitiveObjectInspectorFactory.javaDoubleObjectInspector)},
             new Object[] {Arrays.asList(0.d, 1.d), Arrays.asList(2.d, 3.d)});
     }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/test/java/hivemall/tools/array/ConditionalEmitUDTFTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/hivemall/tools/array/ConditionalEmitUDTFTest.java b/core/src/test/java/hivemall/tools/array/ConditionalEmitUDTFTest.java
index ef45983..7045235 100644
--- a/core/src/test/java/hivemall/tools/array/ConditionalEmitUDTFTest.java
+++ b/core/src/test/java/hivemall/tools/array/ConditionalEmitUDTFTest.java
@@ -18,12 +18,12 @@
  */
 package hivemall.tools.array;
 
+import hivemall.TestUtils;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
-import hivemall.TestUtils;
 import org.apache.hadoop.hive.ql.metadata.HiveException;
 import org.apache.hadoop.hive.ql.udf.generic.Collector;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
@@ -80,4 +80,5 @@ public class ConditionalEmitUDTFTest {
                     {Arrays.asList(true, false, true), Arrays.asList("one", "two", "three")},
                     {Arrays.asList(true, true, false), Arrays.asList("one", "two", "three")}});
     }
+
 }


[2/4] incubator-hivemall git commit: [HIVEMALL-145] Merge Brickhouse functions

Posted by my...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/test/java/hivemall/tools/datetime/SessionizeUDFTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/hivemall/tools/datetime/SessionizeUDFTest.java b/core/src/test/java/hivemall/tools/datetime/SessionizeUDFTest.java
new file mode 100644
index 0000000..2aca351
--- /dev/null
+++ b/core/src/test/java/hivemall/tools/datetime/SessionizeUDFTest.java
@@ -0,0 +1,76 @@
+/*
+ * 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 hivemall.tools.datetime;
+
+import static hivemall.utils.hadoop.WritableUtils.val;
+
+import hivemall.TestUtils;
+
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.io.Text;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class SessionizeUDFTest {
+
+    @Test
+    public void testTwoArgs() {
+        SessionizeUDF udf = new SessionizeUDF();
+
+        Text session1 = new Text(udf.evaluate(val(30L), val(10L)));
+        Assert.assertNotNull(session1);
+
+        Text session2 = new Text(udf.evaluate(val(35L), val(10L)));
+        Assert.assertEquals(session1, session2);
+
+        Text session3 = new Text(udf.evaluate(val(40L), val(10L)));
+        Assert.assertEquals(session2, session3);
+
+        Text session4 = new Text(udf.evaluate(val(50L), val(10L)));
+        Assert.assertNotEquals(session3, session4);
+    }
+
+    @Test
+    public void testThreeArgs() {
+        SessionizeUDF udf = new SessionizeUDF();
+
+        Text session1 = new Text(udf.evaluate(val(30L), val(10L), val("subject1")));
+        Assert.assertNotNull(session1);
+
+        Text session2 = new Text(udf.evaluate(val(35L), val(10L), val("subject1")));
+        Assert.assertEquals(session1, session2);
+
+        Text session3 = new Text(udf.evaluate(val(40L), val(10L), val("subject2")));
+        Assert.assertNotEquals(session2, session3);
+
+        Text session4 = new Text(udf.evaluate(val(45L), val(10L), val("subject2")));
+        Assert.assertEquals(session3, session4);
+    }
+
+    @Test
+    public void testSerialization() throws HiveException {
+        SessionizeUDF udf = new SessionizeUDF();
+
+        udf.evaluate(val((long) (System.currentTimeMillis() / 1000.0d)), val(30L));
+        udf.evaluate(val((long) (System.currentTimeMillis() / 1000.0d)), val(30L));
+
+        byte[] serialized = TestUtils.serializeObjectByKryo(udf);
+        TestUtils.deserializeObjectByKryo(serialized, SessionizeUDF.class);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/test/java/hivemall/tools/json/FromJsonUDFTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/hivemall/tools/json/FromJsonUDFTest.java b/core/src/test/java/hivemall/tools/json/FromJsonUDFTest.java
index 8bb8db7..738a939 100644
--- a/core/src/test/java/hivemall/tools/json/FromJsonUDFTest.java
+++ b/core/src/test/java/hivemall/tools/json/FromJsonUDFTest.java
@@ -90,4 +90,5 @@ public class FromJsonUDFTest {
                     HiveUtils.getConstStringObjectInspector("array<double>")},
             new Object[] {"[0.1,1.1,2.2]"});
     }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/test/java/hivemall/tools/json/ToJsonUDFTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/hivemall/tools/json/ToJsonUDFTest.java b/core/src/test/java/hivemall/tools/json/ToJsonUDFTest.java
index 39bd64f..f7f698c 100644
--- a/core/src/test/java/hivemall/tools/json/ToJsonUDFTest.java
+++ b/core/src/test/java/hivemall/tools/json/ToJsonUDFTest.java
@@ -21,6 +21,9 @@ package hivemall.tools.json;
 import hivemall.TestUtils;
 import hivemall.utils.hadoop.WritableUtils;
 
+import java.io.IOException;
+import java.util.Arrays;
+
 import org.apache.hadoop.hive.ql.metadata.HiveException;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredObject;
@@ -31,9 +34,6 @@ import org.apache.hadoop.io.Text;
 import org.junit.Assert;
 import org.junit.Test;
 
-import java.io.IOException;
-import java.util.Arrays;
-
 public class ToJsonUDFTest {
 
     @Test

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/test/java/hivemall/tools/map/MapKeyValuesUDFTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/hivemall/tools/map/MapKeyValuesUDFTest.java b/core/src/test/java/hivemall/tools/map/MapKeyValuesUDFTest.java
new file mode 100644
index 0000000..2164dc1
--- /dev/null
+++ b/core/src/test/java/hivemall/tools/map/MapKeyValuesUDFTest.java
@@ -0,0 +1,81 @@
+/*
+ * 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 hivemall.tools.map;
+
+import hivemall.TestUtils;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
+import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class MapKeyValuesUDFTest {
+
+
+    @Test
+    public void testStringDouble() throws HiveException, IOException {
+        MapKeyValuesUDF udf = new MapKeyValuesUDF();
+
+        udf.initialize(new ObjectInspector[] {ObjectInspectorFactory.getStandardMapObjectInspector(
+            PrimitiveObjectInspectorFactory.javaStringObjectInspector,
+            PrimitiveObjectInspectorFactory.writableDoubleObjectInspector)});
+
+        Map<String, DoubleWritable> input = new HashMap<>();
+        for (int i = 0; i < 10; i++) {
+            input.put("k" + i, new DoubleWritable(i));
+        }
+
+        GenericUDF.DeferredObject[] arguments =
+                new GenericUDF.DeferredObject[] {new GenericUDF.DeferredJavaObject(input)};
+
+        List<Object[]> actual = udf.evaluate(arguments);
+
+        Assert.assertEquals(input.size(), actual.size());
+        for (Object[] e : actual) {
+            Assert.assertEquals(2, e.length);
+            Object v = input.get(e[0]);
+            Assert.assertEquals(e[1], v);
+        }
+
+        udf.close();
+    }
+
+    @Test
+    public void testSerialization() throws UDFArgumentException {
+        MapKeyValuesUDF udf = new MapKeyValuesUDF();
+
+        udf.initialize(new ObjectInspector[] {ObjectInspectorFactory.getStandardMapObjectInspector(
+            PrimitiveObjectInspectorFactory.javaStringObjectInspector,
+            PrimitiveObjectInspectorFactory.writableDoubleObjectInspector)});
+
+        byte[] serialized = TestUtils.serializeObjectByKryo(udf);
+        TestUtils.deserializeObjectByKryo(serialized, MapKeyValuesUDF.class);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/test/java/hivemall/tools/sanity/RaiseErrorUDFTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/hivemall/tools/sanity/RaiseErrorUDFTest.java b/core/src/test/java/hivemall/tools/sanity/RaiseErrorUDFTest.java
index 004ba26..a96ea57 100644
--- a/core/src/test/java/hivemall/tools/sanity/RaiseErrorUDFTest.java
+++ b/core/src/test/java/hivemall/tools/sanity/RaiseErrorUDFTest.java
@@ -18,15 +18,21 @@
  */
 package hivemall.tools.sanity;
 
+import java.io.IOException;
+
 import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredObject;
 import org.junit.Test;
 
 public class RaiseErrorUDFTest {
 
     @Test(expected = HiveException.class)
-    public void test() throws HiveException {
+    public void test() throws HiveException, IOException {
         RaiseErrorUDF udf = new RaiseErrorUDF();
-        udf.evaluate();
+
+        udf.evaluate(new DeferredObject[] {});
+
+        udf.close();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/test/java/hivemall/tools/timeseries/MovingAverageUDTFTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/hivemall/tools/timeseries/MovingAverageUDTFTest.java b/core/src/test/java/hivemall/tools/timeseries/MovingAverageUDTFTest.java
new file mode 100644
index 0000000..815b567
--- /dev/null
+++ b/core/src/test/java/hivemall/tools/timeseries/MovingAverageUDTFTest.java
@@ -0,0 +1,80 @@
+/*
+ * 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 hivemall.tools.timeseries;
+
+import hivemall.TestUtils;
+import hivemall.tools.timeseries.MovingAverageUDTF;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.udf.generic.Collector;
+import org.apache.hadoop.hive.serde2.io.DoubleWritable;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class MovingAverageUDTFTest {
+
+    @Test
+    public void test() throws HiveException {
+        MovingAverageUDTF udtf = new MovingAverageUDTF();
+
+        ObjectInspector argOI0 = PrimitiveObjectInspectorFactory.javaFloatObjectInspector;
+        ObjectInspector argOI1 = ObjectInspectorUtils.getConstantObjectInspector(
+            PrimitiveObjectInspectorFactory.javaIntObjectInspector, 3);
+
+        final List<Double> results = new ArrayList<>();
+        udtf.initialize(new ObjectInspector[] {argOI0, argOI1});
+        udtf.setCollector(new Collector() {
+            @Override
+            public void collect(Object input) throws HiveException {
+                Object[] objs = (Object[]) input;
+                Assert.assertEquals(1, objs.length);
+                Assert.assertTrue(objs[0] instanceof DoubleWritable);
+                double x = ((DoubleWritable) objs[0]).get();
+                results.add(x);
+            }
+        });
+
+        udtf.process(new Object[] {1.f, null});
+        udtf.process(new Object[] {2.f, null});
+        udtf.process(new Object[] {3.f, null});
+        udtf.process(new Object[] {4.f, null});
+        udtf.process(new Object[] {5.f, null});
+        udtf.process(new Object[] {6.f, null});
+        udtf.process(new Object[] {7.f, null});
+
+        Assert.assertEquals(Arrays.asList(1.d, 1.5d, 2.d, 3.d, 4.d, 5.d, 6.d), results);
+    }
+
+    @Test
+    public void testSerialization() throws HiveException {
+        TestUtils.testGenericUDTFSerialization(MovingAverageUDTF.class,
+            new ObjectInspector[] {PrimitiveObjectInspectorFactory.javaFloatObjectInspector,
+                    ObjectInspectorUtils.getConstantObjectInspector(
+                        PrimitiveObjectInspectorFactory.javaIntObjectInspector, 3)},
+            new Object[][] {{1.f}, {2.f}, {3.f}, {4.f}, {5.f}});
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/test/java/hivemall/tools/vector/VectorAddUDFTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/hivemall/tools/vector/VectorAddUDFTest.java b/core/src/test/java/hivemall/tools/vector/VectorAddUDFTest.java
index 0aa90e7..fd70fcb 100644
--- a/core/src/test/java/hivemall/tools/vector/VectorAddUDFTest.java
+++ b/core/src/test/java/hivemall/tools/vector/VectorAddUDFTest.java
@@ -94,4 +94,5 @@ public class VectorAddUDFTest {
                         PrimitiveObjectInspectorFactory.javaFloatObjectInspector)},
             new Object[] {Arrays.asList(1.d, 2.d, 3.d), Arrays.asList(2.f, 3.f, 4.f)});
     }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/test/java/hivemall/tools/vector/VectorDotUDFTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/hivemall/tools/vector/VectorDotUDFTest.java b/core/src/test/java/hivemall/tools/vector/VectorDotUDFTest.java
index b13c447..eb5c08f 100644
--- a/core/src/test/java/hivemall/tools/vector/VectorDotUDFTest.java
+++ b/core/src/test/java/hivemall/tools/vector/VectorDotUDFTest.java
@@ -52,8 +52,8 @@ public class VectorDotUDFTest {
                 new GenericUDF.DeferredJavaObject(
                     WritableUtils.toWritableList(new float[] {2, 3, 4}))};
 
-        List<Double> actual = udf.evaluate(args);
-        List<Double> expected = Arrays.asList(2.d, 6.d, 12.d);
+        Object actual = udf.evaluate(args);
+        Double expected = Double.valueOf(1.d * 2.d + 2.d * 3.d + 3.d * 4.d);
 
         Assert.assertEquals(expected, actual);
 
@@ -74,7 +74,7 @@ public class VectorDotUDFTest {
                     WritableUtils.toWritableList(new double[] {1, 2, 3})),
                 new GenericUDF.DeferredJavaObject(WritableUtils.val(2.f))};
 
-        List<Double> actual = udf.evaluate(args);
+        Object actual = udf.evaluate(args);
         List<Double> expected = Arrays.asList(2.d, 4.d, 6.d);
 
         Assert.assertEquals(expected, actual);
@@ -92,4 +92,5 @@ public class VectorDotUDFTest {
                         PrimitiveObjectInspectorFactory.javaFloatObjectInspector)},
             new Object[] {Arrays.asList(1.d, 2.d, 3.d), Arrays.asList(2.f, 3.f, 4.f)});
     }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/docs/gitbook/misc/funcs.md
----------------------------------------------------------------------
diff --git a/docs/gitbook/misc/funcs.md b/docs/gitbook/misc/funcs.md
index 00d7bba..3449419 100644
--- a/docs/gitbook/misc/funcs.md
+++ b/docs/gitbook/misc/funcs.md
@@ -393,6 +393,84 @@ This page describes a list of Hivemall functions. See also a [list of generic Hi
 
 - `approx_count_distinct(expr x [, const string options])` - Returns an approximation of count(DISTINCT x) using HyperLogLogPlus algorithm
 
+- `bloom(string key)` - Constructs a BloomFilter by aggregating a set of keys
+  ```sql
+  CREATE TABLE satisfied_movies AS 
+    SELECT bloom(movieid) as movies
+    FROM (
+      SELECT movieid
+      FROM ratings
+      GROUP BY movieid
+      HAVING avg(rating) >= 4.0
+    ) t;
+  ```
+
+- `bloom_and(string bloom1, string bloom2)` - Returns the logical AND of two bloom filters
+  ```sql
+  SELECT bloom_and(bf1, bf2) FROM xxx;
+  ```
+
+- `bloom_contains(string bloom, string key)` or _FUNC_(string bloom, array&lt;string&gt; keys) - Returns true if the bloom filter contains all the given key(s). Returns false if key is null.
+  ```sql
+  WITH satisfied_movies as (
+    SELECT bloom(movieid) as movies
+    FROM (
+      SELECT movieid
+      FROM ratings
+      GROUP BY movieid
+      HAVING avg(rating) >= 4.0
+    ) t
+  )
+  SELECT
+    l.rating,
+    count(distinct l.userid) as cnt
+  FROM
+    ratings l 
+    CROSS JOIN satisfied_movies r
+  WHERE
+    bloom_contains(r.movies, l.movieid) -- includes false positive
+  GROUP BY 
+    l.rating;
+
+  l.rating        cnt
+  1       1296
+  2       2770
+  3       5008
+  4       5824
+  5       5925
+  ```
+
+- `bloom_contains_any(string bloom, string key)` or _FUNC_(string bloom, array&lt;string&gt; keys)- Returns true if the bloom filter contains any of the given key
+  ```sql
+  WITH data1 as (
+    SELECT explode(array(1,2,3,4,5)) as id
+  ),
+  data2 as (
+    SELECT explode(array(1,3,5,6,8)) as id
+  ),
+  bloom as (
+    SELECT bloom(id) as bf
+    FROM data1
+  )
+  SELECT 
+    l.* 
+  FROM 
+    data2 l
+    CROSS JOIN bloom r
+  WHERE
+    bloom_contains_any(r.bf, array(l.id))
+  ```
+
+- `bloom_not(string bloom)` - Returns the logical NOT of a bloom filters
+  ```sql
+  SELECT bloom_not(bf) FROM xxx;
+  ```
+
+- `bloom_or(string bloom1, string bloom2)` - Returns the logical OR of two bloom filters
+  ```sql
+  SELECT bloom_or(bf1, bf2) FROM xxx;
+  ```
+
 # Ensemble learning
 
 - `argmin_kld(float mean, float covar)` - Returns mean or covar that minimize a KL-distance among distributions
@@ -446,7 +524,7 @@ This page describes a list of Hivemall functions. See also a [list of generic Hi
 
 - `hivemall_version()` - Returns the version of Hivemall
   ```sql
-  Usage: SELECT hivemall_version();
+  SELECT hivemall_version();
   ```
 
 - `lr_datagen(options string)` - Generates a logistic regression dataset

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/docs/gitbook/misc/generic_funcs.md
----------------------------------------------------------------------
diff --git a/docs/gitbook/misc/generic_funcs.md b/docs/gitbook/misc/generic_funcs.md
index d33ab21..343a64a 100644
--- a/docs/gitbook/misc/generic_funcs.md
+++ b/docs/gitbook/misc/generic_funcs.md
@@ -24,88 +24,183 @@ This page describes a list of useful Hivemall generic functions. See also a [lis
 # Array
 
 - `array_append(array<T> arr, T elem)` - Append an element to the end of an array
+  ```sql
+  SELECT array_append(array(1,2),3);
+   1,2,3
+
+  SELECT array_append(array('a','b'),'c');
+   "a","b","c"
+  ```
 
 - `array_avg(array<number>)` - Returns an array&lt;double&gt; in which each element is the mean of a set of numbers
 
 - `array_concat(array<ANY> x1, array<ANY> x2, ..)` - Returns a concatenated array
   ```sql
-  select array_concat(array(1),array(2,3));
-  > [1,2,3]
+  SELECT array_concat(array(1),array(2,3));
+   [1,2,3]
   ```
 
 - `array_flatten(array<array<ANY>>)` - Returns an array with the elements flattened.
+  ```sql
+  SELECT array_flatten(array(array(1,2,3),array(4,5),array(6,7,8)));
+   [1,2,3,4,5,6,7,8]
+  ```
 
 - `array_intersect(array<ANY> x1, array<ANY> x2, ..)` - Returns an intersect of given arrays
   ```sql
-  select array_intersect(array(1,3,4),array(2,3,4),array(3,5));
-  > [3]
+  SELECT array_intersect(array(1,3,4),array(2,3,4),array(3,5));
+   [3]
   ```
 
 - `array_remove(array<int|text> original, int|text|array<int> target)` - Returns an array that the target is removed from the original array
   ```sql
-  select array_remove(array(1,null,3),array(null));
-  > [3]
+  SELECT array_remove(array(1,null,3),array(null));
+   [3]
 
-  select array_remove(array("aaa","bbb"),"bbb");
-  > ["aaa"]
+  SELECT array_remove(array("aaa","bbb"),"bbb");
+   ["aaa"]
   ```
 
 - `array_slice(array<ANY> values, int offset [, int length])` - Slices the given array by the given offset and length parameters.
   ```sql
-  select array_slice(array(1,2,3,4,5,6), 2,4);
-  > [3,4]
+  SELECT 
+    array_slice(array(1,2,3,4,5,6), 2,4),
+    array_slice(
+     array("zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"),
+     0, -- offset
+     2 -- length
+    ),
+    array_slice(
+     array("zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"),
+     6, -- offset
+     3 -- length
+    ),
+    array_slice(
+     array("zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"),
+     6, -- offset
+     10 -- length
+    ),
+    array_slice(
+     array("zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"),
+     6 -- offset
+    ),
+    array_slice(
+     array("zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"),
+     -3 -- offset
+    ),
+    array_slice(
+     array("zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"),
+     -3, -- offset
+     2 -- length
+    );
+
+   [3,4]
+   ["zero","one"] 
+   ["six","seven","eight"]
+   ["six","seven","eight","nine","ten"]
+   ["six","seven","eight","nine","ten"]
+   ["eight","nine","ten"]
+   ["eight","nine"]
   ```
 
 - `array_sum(array<number>)` - Returns an array&lt;double&gt; in which each element is summed up
 
+- `array_to_str(array arr [, string sep=','])` - Convert array to string using a sperator
+  ```sql
+  SELECT array_to_str(array(1,2,3),'-');
+  1-2-3
+  ```
+
 - `array_union(array1, array2, ...)` - Returns the union of a set of arrays
+  ```sql
+  SELECT array_union(array(1,2),array(1,2));
+  [1,2]
+
+  SELECT array_union(array(1,2),array(2,3),array(2,5));
+  [1,2,3,5]
+  ```
 
 - `conditional_emit(array<boolean> conditions, array<primitive> features)` - Emit features of a row according to various conditions
+  ```sql
+  WITH input as (
+     select array(true, false, true) as conditions, array("one", "two", "three") as features
+     UNION ALL
+     select array(true, true, false), array("four", "five", "six")
+  )
+  SELECT
+    conditional_emit(
+       conditions, features
+    )
+  FROM 
+    input;
+   one
+   three
+   four
+   five
+  ```
 
 - `element_at(array<T> list, int pos)` - Returns an element at the given position
+  ```sql
+  SELECT element_at(array(1,2,3,4),0);
+   1
+
+  SELECT element_at(array(1,2,3,4),-2);
+   3
+  ```
+
+- `first_element(x)` - Returns the first element in an array
+  ```sql
+  SELECT first_element(array('a','b','c'));
+   a
 
-- `first_element(x)` - Returns the first element in an array 
+  SELECT first_element(array());
+   NULL
+  ```
 
 - `float_array(nDims)` - Returns an array&lt;float&gt; of nDims elements
 
 - `last_element(x)` - Return the last element in an array
+  ```sql
+  SELECT last_element(array('a','b','c'));
+   c
+  ```
 
 - `select_k_best(array<number> array, const array<number> importance, const int k)` - Returns selected top-k elements as array&lt;double&gt;
 
 - `sort_and_uniq_array(array<int>)` - Takes array&lt;int&gt; and returns a sorted array with duplicate elements eliminated
   ```sql
-  select sort_and_uniq_array(array(3,1,1,-2,10));
-  > [-2,1,3,10]
+  SELECT sort_and_uniq_array(array(3,1,1,-2,10));
+   [-2,1,3,10]
   ```
 
 - `subarray_endwith(array<int|text> original, int|text key)` - Returns an array that ends with the specified key
   ```sql
-  select subarray_endwith(array(1,2,3,4), 3);
-  > [1,2,3]
+  SELECT subarray_endwith(array(1,2,3,4), 3);
+   [1,2,3]
   ```
 
 - `subarray_startwith(array<int|text> original, int|text key)` - Returns an array that starts with the specified key
   ```sql
-  select subarray_startwith(array(1,2,3,4), 2);
-  > [2,3,4]
+  SELECT subarray_startwith(array(1,2,3,4), 2);
+   [2,3,4]
   ```
 
 - `to_string_array(array<ANY>)` - Returns an array of strings
 
 - `to_ordered_list(PRIMITIVE value [, PRIMITIVE key, const string options])` - Return list of values sorted by value itself or specific key
   ```sql
-  with t as (
-      select 5 as key, 'apple' as value
-      union all
-      select 3 as key, 'banana' as value
-      union all
-      select 4 as key, 'candy' as value
-      union all
-      select 2 as key, 'donut' as value
-      union all
-      select 3 as key, 'egg' as value
+  WITH t as (
+      SELECT 5 as key, 'apple' as value
+      UNION ALL
+      SELECT 3 as key, 'banana' as value
+      UNION ALL
+      SELECT 4 as key, 'candy' as value
+      UNION ALL
+      SELECT 2 as key, 'donut' as value
+      UNION ALL
+      SELECT 3 as key, 'egg' as value
   )
-  select                                             -- expected output
+  SELECT                                             -- expected output
       to_ordered_list(value, key, '-reverse'),       -- [apple, candy, (banana, egg | egg, banana), donut] (reverse order)
       to_ordered_list(value, key, '-k 2'),           -- [apple, candy] (top-k)
       to_ordered_list(value, key, '-k 100'),         -- [apple, candy, (banana, egg | egg, banana), dunut]
@@ -117,16 +212,230 @@ This page describes a list of useful Hivemall generic functions. See also a [lis
       to_ordered_list(value, '-k 2'),                -- [egg, donut] (alphabetically)
       to_ordered_list(key, '-k -2 -reverse'),        -- [5, 4] (top-2 keys)
       to_ordered_list(key)                           -- [2, 3, 3, 4, 5] (natural ordered keys)
-  from
+  FROM
       t
   ```
 
+# Bitset
+
+- `bits_collect(int|long x)` - Returns a bitset in array&lt;long&gt;
+
+- `bits_or(array<long> b1, array<long> b2, ..)` - Returns a logical OR given bitsets
+  ```sql
+  SELECT unbits(bits_or(to_bits(array(1,4)),to_bits(array(2,3))));
+   [1,2,3,4]
+  ```
+
+- `to_bits(int[] indexes)` - Returns an bitset representation if the given indexes in long[]
+  ```sql
+  SELECT to_bits(array(1,2,3,128));
+   [14,-9223372036854775808]
+  ```
+
+- `unbits(long[] bitset)` - Returns an long array of the give bitset representation
+  ```sql
+  SELECT unbits(to_bits(array(1,4,2,3)));
+   [1,2,3,4]
+  ```
+
+# Compression
+
+- `deflate(TEXT data [, const int compressionLevel])` - Returns a compressed BINARY object by using Deflater. The compression level must be in range [-1,9]
+  ```sql
+  SELECT base91(deflate('aaaaaaaaaaaaaaaabbbbccc'));
+   AA+=kaIM|WTt!+wbGAA
+  ```
+
+- `inflate(BINARY compressedData)` - Returns a decompressed STRING by using Inflater
+  ```sql
+  SELECT inflate(unbase91(base91(deflate('aaaaaaaaaaaaaaaabbbbccc'))));
+   aaaaaaaaaaaaaaaabbbbccc
+  ```
+
+# Datetime
+
+- `sessionize(long timeInSec, long thresholdInSec [, String subject])`- Returns a UUID string of a session.
+  ```sql
+  SELECT 
+    sessionize(time, 3600, ip_addr) as session_id, 
+    time, ip_addr
+  FROM (
+    SELECT time, ipaddr 
+    FROM weblog 
+    DISTRIBUTE BY ip_addr, time SORT BY ip_addr, time DESC
+  ) t1
+  ```
+
+# JSON
+
+- `from_json(string jsonString, const string returnTypes [, const array<string>|const string columnNames])` - Return Hive object.
+  ```sql
+  SELECT
+    from_json(
+      '{ "person" : { "name" : "makoto" , "age" : 37 } }',
+      'struct<name:string,age:int>', 
+      array('person')
+    ),
+    from_json(
+      '[0.1,1.1,2.2]',
+      'array<double>'
+    ),
+    from_json(to_json(
+      ARRAY(
+        NAMED_STRUCT("country", "japan", "city", "tokyo"), 
+        NAMED_STRUCT("country", "japan", "city", "osaka")
+      )
+    ),'array<struct<country:string,city:string>>'),
+    from_json(to_json(
+      ARRAY(
+        NAMED_STRUCT("country", "japan", "city", "tokyo"), 
+        NAMED_STRUCT("country", "japan", "city", "osaka")
+      ),
+      array('city')
+    ), 'array<struct<country:string,city:string>>'),
+    from_json(to_json(
+      ARRAY(
+        NAMED_STRUCT("country", "japan", "city", "tokyo"), 
+        NAMED_STRUCT("country", "japan", "city", "osaka")
+      )
+    ),'array<struct<city:string>>');
+  ```
+
+  ```
+   {"name":"makoto","age":37}
+   [0.1,1.1,2.2]
+   [{"country":"japan","city":"tokyo"},{"country":"japan","city":"osaka"}]
+   [{"country":"japan","city":"tokyo"},{"country":"japan","city":"osaka"}]
+   [{"city":"tokyo"},{"city":"osaka"}]
+  ```
+
+- `to_json(ANY object [, const array<string>|const string columnNames])` - Returns Json string
+  ```sql
+  SELECT 
+    NAMED_STRUCT("Name", "John", "age", 31),
+    to_json(
+       NAMED_STRUCT("Name", "John", "age", 31)
+    ),
+    to_json(
+       NAMED_STRUCT("Name", "John", "age", 31),
+       array('Name', 'age')
+    ),
+    to_json(
+       NAMED_STRUCT("Name", "John", "age", 31),
+       array('name', 'age')
+    ),
+    to_json(
+       NAMED_STRUCT("Name", "John", "age", 31),
+       array('age')
+    ),
+    to_json(
+       NAMED_STRUCT("Name", "John", "age", 31),
+       array()
+    ),
+    to_json(
+       null,
+       array()
+    ),
+    to_json(
+      struct("123", "456", 789, array(314,007)),
+      array('ti','si','i','bi')
+    ),
+    to_json(
+      struct("123", "456", 789, array(314,007)),
+      'ti,si,i,bi'
+    ),
+    to_json(
+      struct("123", "456", 789, array(314,007))
+    ),
+    to_json(
+      NAMED_STRUCT("country", "japan", "city", "tokyo")
+    ),
+    to_json(
+      NAMED_STRUCT("country", "japan", "city", "tokyo"), 
+      array('city')
+    ),
+    to_json(
+      ARRAY(
+        NAMED_STRUCT("country", "japan", "city", "tokyo"), 
+        NAMED_STRUCT("country", "japan", "city", "osaka")
+      )
+    ),
+    to_json(
+      ARRAY(
+        NAMED_STRUCT("country", "japan", "city", "tokyo"), 
+        NAMED_STRUCT("country", "japan", "city", "osaka")
+      ),
+      array('city')
+    );
+  ```
+
+  ```
+   {"name":"John","age":31}
+   {"name":"John","age":31}
+   {"Name":"John","age":31}
+   {"name":"John","age":31}
+   {"age":31}
+   {}
+   NULL
+   {"ti":"123","si":"456","i":789,"bi":[314,7]}
+   {"ti":"123","si":"456","i":789,"bi":[314,7]}
+   {"col1":"123","col2":"456","col3":789,"col4":[314,7]}
+   {"country":"japan","city":"tokyo"}
+   {"city":"tokyo"}
+   [{"country":"japan","city":"tokyo"},{"country":"japan","city":"osaka"}]
+   [{"country":"japan","city":"tokyo"},{"country":"japan","city":"osaka"}]
+  ```
+
 # Map
 
+- `map_exclude_keys(Map<K,V> map, array<K> filteringKeys)` - Returns the filtered entries of a map not having specified keys
+  ```sql
+  SELECT map_exclude_keys(map(1,'one',2,'two',3,'three'),array(2,3));
+  {1:"one"}
+  ```
+
 - `map_get_sum(map<int,float> src, array<int> keys)` - Returns sum of values that are retrieved by keys
 
+- `map_include_keys(Map<K,V> map, array<K> filteringKeys)` - Returns the filtered entries of a map having specified keys
+  ```sql
+  SELECT map_include_keys(map(1,'one',2,'two',3,'three'),array(2,3));
+  {2:"two",3:"three"}
+  ```
+
+- `map_index(a, n)` - Returns the n-th element of the given array
+  ```sql
+  WITH tmp as (
+    SELECT "one" as key
+    UNION ALL
+    SELECT "two" as key
+  )
+  SELECT map_index(map("one",1,"two",2),key)
+  FROM tmp;
+
+  1
+  2
+  ```
+
+- `map_key_values(map)` - Returns a array of key-value pairs.
+  ```sql
+  SELECT map_key_values(map("one",1,"two",2));
+
+  [{"key":"one","value":1},{"key":"two","value":2}]
+  ```
+
 - `map_tail_n(map SRC, int N)` - Returns the last N elements from a sorted array of SRC
 
+- `merge_maps(x)` - Returns a map which contains the union of an aggregation of maps. Note that an existing value of a key can be replaced with the other duplicate key entry.
+  ```sql
+  SELECT 
+    merge_maps(m) 
+  FROM (
+    SELECT map('A',10,'B',20,'C',30) 
+    UNION ALL 
+    SELECT map('A',10,'B',20,'C',30)
+  ) t
+  ```
+
 - `to_map(key, value)` - Convert two aggregated columns into a key-value map
 
 - `to_ordered_map(key, value [, const int k|const boolean reverseOrder=false])` - Convert two aggregated columns into an ordered key-value map
@@ -152,42 +461,6 @@ This page describes a list of useful Hivemall generic functions. See also a [lis
   from t
   ```
 
-# Bitset
-
-- `bits_collect(int|long x)` - Returns a bitset in array&lt;long&gt;
-
-- `bits_or(array<long> b1, array<long> b2, ..)` - Returns a logical OR given bitsets
-  ```sql
-  select unbits(bits_or(to_bits(array(1,4)),to_bits(array(2,3))));
-  > [1,2,3,4]
-  ```
-
-- `to_bits(int[] indexes)` - Returns an bitset representation if the given indexes in long[]
-  ```sql
-  select to_bits(array(1,2,3,128));
-  > [14,-9223372036854775808]
-  ```
-
-- `unbits(long[] bitset)` - Returns an long array of the give bitset representation
-  ```sql
-  select unbits(to_bits(array(1,4,2,3)));
-  > [1,2,3,4]
-  ```
-
-# Compression
-
-- `deflate(TEXT data [, const int compressionLevel])` - Returns a compressed BINARY object by using Deflater. The compression level must be in range [-1,9]
-  ```sql
-  select base91(deflate('aaaaaaaaaaaaaaaabbbbccc'));
-  > AA+=kaIM|WTt!+wbGAA
-  ```
-
-- `inflate(BINARY compressedData)` - Returns a decompressed STRING by using Inflater
-  ```sql
-  select inflate(unbase91(base91(deflate('aaaaaaaaaaaaaaaabbbbccc'))));
-  > aaaaaaaaaaaaaaaabbbbccc
-  ```
-
 # MapReduce
 
 - `distcache_gets(filepath, key, default_value [, parseKey])` - Returns map&lt;key_type, value_type&gt;|value_type
@@ -198,9 +471,9 @@ This page describes a list of useful Hivemall generic functions. See also a [lis
 
 - `rowid()` - Returns a generated row id of a form {TASK_ID}-{SEQUENCE_NUMBER}
 
-- `rownum()` - Returns a generated row number in long
-  ```
-  returns sprintf(`%d%04d`,sequence,taskId) as long
+- `rownum()` - Returns a generated row number `sprintf(`%d%04d`,sequence,taskId)` in long
+  ```sql
+  SELECT rownum() as rownum, xxx from ...
   ```
 
 - `taskid()` - Returns the value of mapred.task.partition
@@ -215,47 +488,91 @@ This page describes a list of useful Hivemall generic functions. See also a [lis
 
 - `transpose_and_dot(array<number> matrix0_row, array<number> matrix1_row)` - Returns dot(matrix0.T, matrix1) as array&lt;array&lt;double&gt;&gt;, shape = (matrix0.#cols, matrix1.#cols)
 
+# Sanity Checks
+
+- `assert(boolean condition)` or _FUNC_(boolean condition, string errMsg)- Throws HiveException if condition is not met
+  ```sql
+  SELECT count(1) FROM stock_price WHERE assert(price > 0.0);
+  SELECT count(1) FROM stock_price WHERE assert(price > 0.0, 'price MUST be more than 0.0')
+  ```
+
+- `raise_error()` or _FUNC_(string msg) - Throws an error
+  ```sql
+  SELECT product_id, price, raise_error('Found an invalid record') FROM xxx WHERE price < 0.0
+  ```
+
 # Text processing
 
 - `base91(BINARY bin)` - Convert the argument from binary to a BASE91 string
   ```sql
-  select base91(deflate('aaaaaaaaaaaaaaaabbbbccc'));
-  > AA+=kaIM|WTt!+wbGAA
+  SELECT base91(deflate('aaaaaaaaaaaaaaaabbbbccc'));
+   AA+=kaIM|WTt!+wbGAA
   ```
 
 - `is_stopword(string word)` - Returns whether English stopword or not
 
 - `normalize_unicode(string str [, string form])` - Transforms `str` with the specified normalization form. The `form` takes one of NFC (default), NFD, NFKC, or NFKD
   ```sql
-  select normalize_unicode('ハンカクカナ','NFKC');
-  > ハンカクカナ
+  SELECT normalize_unicode('ハンカクカナ','NFKC');
+   ハンカクカナ
 
-  select normalize_unicode('㈱㌧㌦Ⅲ','NFKC');
-  > (株)トンドルIII
+  SELECT normalize_unicode('㈱㌧㌦Ⅲ','NFKC');
+   (株)トンドルIII
   ```
 
 - `singularize(string word)` - Returns singular form of a given English word
   ```sql
-  select singularize(lower("Apples"));
+  SELECT singularize(lower("Apples"));
 
-  > "apple"
+   "apple"
   ```
 
-- `split_words(string query [, string regex])` - Returns an array&lt;text&gt; containing split strings
+- `split_words(string query [, string regex])` - Returns an array&lt;text&gt; containing splitted strings
 
 - `tokenize(string englishText [, boolean toLowerCase])` - Returns tokenized words in array&lt;string&gt;
 
 - `unbase91(string)` - Convert a BASE91 string to a binary
   ```sql
-  select inflate(unbase91(base91(deflate('aaaaaaaaaaaaaaaabbbbccc'))));
-  > aaaaaaaaaaaaaaaabbbbccc
+  SELECT inflate(unbase91(base91(deflate('aaaaaaaaaaaaaaaabbbbccc'))));
+   aaaaaaaaaaaaaaaabbbbccc
   ```
 
 - `word_ngrams(array<string> words, int minSize, int maxSize])` - Returns list of n-grams for given words, where `minSize &lt;= n &lt;= maxSize`
   ```sql
-  select word_ngrams(tokenize('Machine learning is fun!', true), 1, 2);
+  SELECT word_ngrams(tokenize('Machine learning is fun!', true), 1, 2);
 
-  > ["machine","machine learning","learning","learning is","is","is fun","fun"]
+   ["machine","machine learning","learning","learning is","is","is fun","fun"]
+  ```
+
+# Timeseries
+
+- `moving_avg(NUMBER value, const int windowSize)` - Returns moving average of a time series using a given window
+  ```sql
+  SELECT moving_avg(x, 3) FROM (SELECT explode(array(1.0,2.0,3.0,4.0,5.0,6.0,7.0)) as x) series;
+   1.0
+   1.5
+   2.0
+   3.0
+   4.0
+   5.0
+   6.0
+  ```
+
+# Vector
+
+- `vector_add(array<NUMBER> x, array<NUMBER> y)` - Perform vector ADD operation.
+  ```sql
+  SELECT vector_add(array(1.0,2.0,3.0), array(2, 3, 4));
+  [3.0,5.0,7.0]
+  ```
+
+- `vector_dot(array<NUMBER> x, array<NUMBER> y)` - Performs vector dot product.
+  ```sql
+  SELECT vector_dot(array(1.0,2.0,3.0),array(2.0,3.0,4.0));
+  20
+
+  SELECT vector_dot(array(1.0,2.0,3.0),2);
+  [2.0,4.0,6.0]
   ```
 
 # Others
@@ -264,25 +581,51 @@ This page describes a list of useful Hivemall generic functions. See also a [lis
 
 - `each_top_k(int K, Object group, double cmpKey, *)` - Returns top-K values (or tail-K values when k is less than 0)
 
-- `generate_series(const int|bigint start, const int|bigint end)` - Generate a series of values, from start to end. A similar function to PostgreSQL's `generate_serics`. http://www.postgresql.org/docs/current/static/functions-srf.html
+- `generate_series(const int|bigint start, const int|bigint end)` - Generate a series of values, from start to end. A similar function to PostgreSQL's [generate_serics](http://www.postgresql.org/docs/current/static/functions-srf.html)
   ```sql
-  select generate_series(1,9);
+  SELECT generate_series(2,4);
 
-  1
-  2
-  3
-  4
-  5
-  6
-  7
-  8
-  9
+   2
+   3
+   4
+
+  SELECT generate_series(5,1,-2);
+
+   5
+   3
+   1
+
+  SELECT generate_series(4,3);
+
+   (no return)
+
+  SELECT date_add(current_date(),value),value from (SELECT generate_series(1,3)) t;
+
+   2018-04-21      1
+   2018-04-22      2
+   2018-04-23      3
+
+  WITH input as (
+   SELECT 1 as c1, 10 as c2, 3 as step
+   UNION ALL
+   SELECT 10, 2, -3
+  )
+  SELECT generate_series(c1, c2, step) as series
+  FROM input;
+
+   1
+   4
+   7
+   10
+   10
+   7
+   4
   ```
 
 - `try_cast(ANY src, const string typeName)` - Explicitly cast a value as a type. Returns null if cast fails.
   ```sql
-  Usage: select try_cast(array(1.0,2.0,3.0), 'array<string>')
-       select try_cast(map('A',10,'B',20,'C',30), 'map<string,double>')
+  SELECT try_cast(array(1.0,2.0,3.0), 'array<string>')
+  SELECT try_cast(map('A',10,'B',20,'C',30), 'map<string,double>')
   ```
 
 - `x_rank(KEY)` - Generates a pseudo sequence number starting from 1 for each key

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 5a78bd1..aa682c6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -196,6 +196,18 @@
 			</roles>
 			<timezone>+9</timezone>
 		</developer>
+		<developer>
+			<id>jbanks</id>
+			<name>Jerome Banks</name>
+			<email>jbanks[at]apache.org</email>
+			<url>https://github.com/jeromebanks/</url>
+			<organization>Jumpshot Inc.</organization>
+			<organizationUrl>https://www.jumpshot.com/</organizationUrl>
+			<roles>
+				<role>Committer</role>
+			</roles>
+			<timezone>-8</timezone>
+		</developer>
 		<!-- Project mentors -->
 		<developer>
 			<id>rvs</id>

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/resources/ddl/define-all-as-permanent.hive
----------------------------------------------------------------------
diff --git a/resources/ddl/define-all-as-permanent.hive b/resources/ddl/define-all-as-permanent.hive
index e7da8e3..5c257c5 100644
--- a/resources/ddl/define-all-as-permanent.hive
+++ b/resources/ddl/define-all-as-permanent.hive
@@ -435,6 +435,30 @@ CREATE FUNCTION array_intersect as 'hivemall.tools.array.ArrayIntersectUDF' USIN
 DROP FUNCTION IF EXISTS select_k_best;
 CREATE FUNCTION select_k_best as 'hivemall.tools.array.SelectKBestUDF' USING JAR '${hivemall_jar}';
 
+DROP FUNCTION IF EXISTS array_append;
+CREATE FUNCTION array_append as 'hivemall.tools.array.ArrayAppendUDF' USING JAR '${hivemall_jar}';
+
+DROP FUNCTION IF EXISTS element_at;
+CREATE FUNCTION element_at as 'hivemall.tools.array.ArrayElementAtUDF' USING JAR '${hivemall_jar}';
+
+DROP FUNCTION IF EXISTS array_union;
+CREATE FUNCTION array_union as 'hivemall.tools.array.ArrayUnionUDF' USING JAR '${hivemall_jar}';
+
+DROP FUNCTION IF EXISTS first_element;
+CREATE FUNCTION first_element as 'hivemall.tools.array.FirstElementUDF' USING JAR '${hivemall_jar}';
+
+DROP FUNCTION IF EXISTS last_element;
+CREATE FUNCTION last_element as 'hivemall.tools.array.LastElementUDF' USING JAR '${hivemall_jar}';
+
+DROP FUNCTION IF EXISTS array_flatten;
+CREATE FUNCTION array_flatten as 'hivemall.tools.array.ArrayFlattenUDF' USING JAR '${hivemall_jar}';
+
+DROP FUNCTION IF EXISTS array_to_str;
+CREATE FUNCTION array_to_str as 'hivemall.tools.array.ArrayToStrUDF' USING JAR '${hivemall_jar}';
+
+DROP FUNCTION IF EXISTS conditional_emit;
+CREATE FUNCTION conditional_emit as 'hivemall.tools.array.ConditionalEmitUDTF' USING JAR '${hivemall_jar}';
+
 -----------------------------
 -- bit operation functions --
 -----------------------------
@@ -477,6 +501,18 @@ CREATE FUNCTION to_map as 'hivemall.tools.map.UDAFToMap' USING JAR '${hivemall_j
 DROP FUNCTION IF EXISTS to_ordered_map;
 CREATE FUNCTION to_ordered_map as 'hivemall.tools.map.UDAFToOrderedMap' USING JAR '${hivemall_jar}';
 
+DROP FUNCTION IF EXISTS map_include_keys;
+CREATE FUNCTION map_include_keys as 'hivemall.tools.map.MapIncludeKeysUDF' USING JAR '${hivemall_jar}';
+
+DROP FUNCTION IF EXISTS map_exclude_keys;
+CREATE FUNCTION map_exclude_keys as 'hivemall.tools.map.MapExcludeKeysUDF' USING JAR '${hivemall_jar}';
+
+DROP FUNCTION IF EXISTS map_index;
+CREATE FUNCTION map_index as 'hivemall.tools.map.MapIndexUDF' USING JAR '${hivemall_jar}';
+
+DROP FUNCTION IF EXISTS map_key_values;
+CREATE FUNCTION map_key_values as 'hivemall.tools.map.MapKeyValuesUDF' USING JAR '${hivemall_jar}';
+
 ---------------------
 -- list functions --
 ---------------------
@@ -494,13 +530,19 @@ CREATE FUNCTION sigmoid as 'hivemall.tools.math.SigmoidGenericUDF' USING JAR '${
 DROP FUNCTION IF EXISTS l2_norm;
 CREATE FUNCTION l2_norm as 'hivemall.tools.math.L2NormUDAF' USING JAR '${hivemall_jar}';
 
-----------------------
--- Matrix functions --
-----------------------
+-----------------------------
+-- Matrix/Vector functions --
+-----------------------------
 
 DROP FUNCTION IF EXISTS transpose_and_dot;
 CREATE FUNCTION transpose_and_dot as 'hivemall.tools.matrix.TransposeAndDotUDAF' USING JAR '${hivemall_jar}';
 
+DROP FUNCTION IF EXISTS vector_add;
+CREATE FUNCTION vector_add as 'hivemall.tools.vector.VectorAddUDF' USING JAR '${hivemall_jar}';
+
+DROP FUNCTION IF EXISTS vector_dot;
+CREATE FUNCTION vector_dot as 'hivemall.tools.vector.VectorDotUDF' USING JAR '${hivemall_jar}';
+
 ----------------------
 -- mapred functions --
 ----------------------
@@ -524,6 +566,26 @@ DROP FUNCTION IF EXISTS jobconf_gets;
 CREATE FUNCTION jobconf_gets as 'hivemall.tools.mapred.JobConfGetsUDF' USING JAR '${hivemall_jar}';
 
 --------------------
+-- JSON functions --
+--------------------
+
+DROP FUNCTION IF EXISTS to_json;
+CREATE FUNCTION to_json as 'hivemall.tools.json.ToJsonUDF' USING JAR '${hivemall_jar}';
+
+DROP FUNCTION IF EXISTS from_json;
+CREATE FUNCTION from_json as 'hivemall.tools.json.FromJsonUDF' USING JAR '${hivemall_jar}';
+
+----------------------------
+-- Sanity Check functions --
+----------------------------
+
+DROP FUNCTION IF EXISTS assert;
+CREATE FUNCTION assert as 'hivemall.tools.sanity.AssertUDF' USING JAR '${hivemall_jar}';
+
+DROP FUNCTION IF EXISTS raise_error;
+CREATE FUNCTION raise_error as 'hivemall.tools.sanity.RaiseErrorUDF' USING JAR '${hivemall_jar}';
+
+--------------------
 -- misc functions --
 --------------------
 
@@ -539,6 +601,15 @@ CREATE FUNCTION x_rank as 'hivemall.tools.RankSequenceUDF' USING JAR '${hivemall
 DROP FUNCTION IF EXISTS each_top_k;
 CREATE FUNCTION each_top_k as 'hivemall.tools.EachTopKUDTF' USING JAR '${hivemall_jar}';
 
+DROP FUNCTION IF EXISTS try_cast;
+CREATE FUNCTION try_cast as 'hivemall.tools.TryCastUDF' USING JAR '${hivemall_jar}';
+
+DROP FUNCTION IF EXISTS sessionize;
+CREATE FUNCTION sessionize as 'hivemall.tools.datetime.SessionizeUDF' USING JAR '${hivemall_jar}';
+
+DROP FUNCTION IF EXISTS moving_avg;
+CREATE FUNCTION moving_avg as 'hivemall.tools.timeseries.MovingAverageUDTF' USING JAR '${hivemall_jar}';
+
 -------------------------------
 -- Text processing functions --
 -------------------------------
@@ -749,6 +820,28 @@ CREATE FUNCTION train_slim as 'hivemall.recommend.SlimUDTF' USING JAR '${hivemal
 DROP FUNCTION IF EXISTS approx_count_distinct;
 CREATE FUNCTION approx_count_distinct as 'hivemall.sketch.hll.ApproxCountDistinctUDAF' USING JAR '${hivemall_jar}';
 
+------------------
+-- Bloom Filter --
+------------------
+
+DROP FUNCTION IF EXISTS bloom;
+CREATE FUNCTION bloom as 'hivemall.sketch.bloom.BloomFilterUDAF' USING JAR '${hivemall_jar}';
+
+DROP FUNCTION IF EXISTS bloom_and;
+CREATE FUNCTION bloom_and as 'hivemall.sketch.bloom.BloomAndUDF' USING JAR '${hivemall_jar}';
+
+DROP FUNCTION IF EXISTS bloom_contains;
+CREATE FUNCTION bloom_contains as 'hivemall.sketch.bloom.BloomContainsUDF' USING JAR '${hivemall_jar}';
+
+DROP FUNCTION IF EXISTS bloom_not;
+CREATE FUNCTION bloom_not as 'hivemall.sketch.bloom.BloomNotUDF' USING JAR '${hivemall_jar}';
+
+DROP FUNCTION IF EXISTS bloom_or;
+CREATE FUNCTION bloom_or as 'hivemall.sketch.bloom.BloomOrUDF' USING JAR '${hivemall_jar}';
+
+DROP FUNCTION IF EXISTS bloom_contains_any;
+CREATE FUNCTION bloom_contains_any as 'hivemall.sketch.bloom.BloomContainsAnyUDF' USING JAR '${hivemall_jar}';
+
 ------------------------------
 -- XGBoost related features --
 ------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/resources/ddl/define-all.hive
----------------------------------------------------------------------
diff --git a/resources/ddl/define-all.hive b/resources/ddl/define-all.hive
index 9228ce9..fbb3ed2 100644
--- a/resources/ddl/define-all.hive
+++ b/resources/ddl/define-all.hive
@@ -427,6 +427,30 @@ create temporary function array_intersect as 'hivemall.tools.array.ArrayIntersec
 drop temporary function if exists select_k_best;
 create temporary function select_k_best as 'hivemall.tools.array.SelectKBestUDF';
 
+drop temporary function if exists array_append;
+create temporary function array_append as 'hivemall.tools.array.ArrayAppendUDF';
+
+drop temporary function if exists element_at;
+create temporary function element_at as 'hivemall.tools.array.ArrayElementAtUDF';
+
+drop temporary function if exists array_union;
+create temporary function array_union as 'hivemall.tools.array.ArrayUnionUDF';
+
+drop temporary function if exists first_element;
+create temporary function first_element as 'hivemall.tools.array.FirstElementUDF';
+
+drop temporary function if exists last_element;
+create temporary function last_element as 'hivemall.tools.array.LastElementUDF';
+
+drop temporary function if exists array_flatten;
+create temporary function array_flatten as 'hivemall.tools.array.ArrayFlattenUDF';
+
+drop temporary function if exists array_to_str;
+create temporary function array_to_str as 'hivemall.tools.array.ArrayToStrUDF';
+
+drop temporary function if exists conditional_emit;
+create temporary function conditional_emit as 'hivemall.tools.array.ConditionalEmitUDTF';
+
 -----------------------------
 -- bit operation functions --
 -----------------------------
@@ -469,6 +493,18 @@ create temporary function to_map as 'hivemall.tools.map.UDAFToMap';
 drop temporary function if exists to_ordered_map;
 create temporary function to_ordered_map as 'hivemall.tools.map.UDAFToOrderedMap';
 
+drop temporary function if exists map_include_keys;
+create temporary function map_include_keys as 'hivemall.tools.map.MapIncludeKeysUDF';
+
+drop temporary function if exists map_exclude_keys;
+create temporary function map_exclude_keys as 'hivemall.tools.map.MapExcludeKeysUDF';
+
+drop temporary function if exists map_index;
+create temporary function map_index as 'hivemall.tools.map.MapIndexUDF';
+
+drop temporary function if exists map_key_values;
+create temporary function map_key_values as 'hivemall.tools.map.MapKeyValuesUDF';
+
 ---------------------
 -- list functions --
 ---------------------
@@ -486,13 +522,19 @@ create temporary function sigmoid as 'hivemall.tools.math.SigmoidGenericUDF';
 drop temporary function if exists l2_norm;
 create temporary function l2_norm as 'hivemall.tools.math.L2NormUDAF';
 
-----------------------
--- Matrix functions --
-----------------------
+-----------------------------
+-- Matrix/Vector functions --
+-----------------------------
 
 drop temporary function if exists transpose_and_dot;
 create temporary function transpose_and_dot as 'hivemall.tools.matrix.TransposeAndDotUDAF';
 
+drop temporary function if exists vector_add;
+create temporary function vector_add as 'hivemall.tools.vector.VectorAddUDF';
+
+drop temporary function if exists vector_dot;
+create temporary function vector_dot as 'hivemall.tools.vector.VectorDotUDF';
+
 ----------------------
 -- mapred functions --
 ----------------------
@@ -516,6 +558,26 @@ drop temporary function if exists jobconf_gets;
 create temporary function jobconf_gets as 'hivemall.tools.mapred.JobConfGetsUDF';
 
 --------------------
+-- JSON functions --
+--------------------
+
+drop temporary function if exists to_json;
+create temporary function to_json as 'hivemall.tools.json.ToJsonUDF';
+
+drop temporary function if exists from_json;
+create temporary function from_json as 'hivemall.tools.json.FromJsonUDF';
+
+----------------------------
+-- Sanity Check functions --
+----------------------------
+
+drop temporary function if exists assert;
+create temporary function assert as 'hivemall.tools.sanity.AssertUDF';
+
+drop temporary function if exists raise_error;
+create temporary function raise_error as 'hivemall.tools.sanity.RaiseErrorUDF';
+
+--------------------
 -- misc functions --
 --------------------
 
@@ -531,6 +593,15 @@ create temporary function x_rank as 'hivemall.tools.RankSequenceUDF';
 drop temporary function if exists each_top_k;
 create temporary function each_top_k as 'hivemall.tools.EachTopKUDTF';
 
+drop temporary function if exists try_cast;
+create temporary function try_cast as 'hivemall.tools.TryCastUDF';
+
+drop temporary function if exists sessionize;
+create temporary function sessionize as 'hivemall.tools.datetime.SessionizeUDF';
+
+drop temporary function if exists moving_avg;
+create temporary function moving_avg as 'hivemall.tools.timeseries.MovingAverageUDTF';
+
 -------------------------------
 -- Text processing functions --
 -------------------------------
@@ -741,6 +812,28 @@ create temporary function train_slim as 'hivemall.recommend.SlimUDTF';
 drop temporary function if exists approx_count_distinct;
 create temporary function approx_count_distinct as 'hivemall.sketch.hll.ApproxCountDistinctUDAF';
 
+------------------
+-- Bloom Filter --
+------------------
+
+drop temporary function if exists bloom;
+create temporary function bloom as 'hivemall.sketch.bloom.BloomFilterUDAF';
+
+drop temporary function if exists bloom_and;
+create temporary function bloom_and as 'hivemall.sketch.bloom.BloomAndUDF';
+
+drop temporary function if exists bloom_contains;
+create temporary function bloom_contains as 'hivemall.sketch.bloom.BloomContainsUDF';
+
+drop temporary function if exists bloom_not;
+create temporary function bloom_not as 'hivemall.sketch.bloom.BloomNotUDF';
+
+drop temporary function if exists bloom_or;
+create temporary function bloom_or as 'hivemall.sketch.bloom.BloomOrUDF';
+
+drop temporary function if exists bloom_contains_any;
+create temporary function bloom_contains_any as 'hivemall.sketch.bloom.BloomContainsAnyUDF';
+
 --------------------------------------------------------------------------------------------------
 -- macros available from hive 0.12.0
 -- see https://issues.apache.org/jira/browse/HIVE-2655

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/resources/ddl/define-all.spark
----------------------------------------------------------------------
diff --git a/resources/ddl/define-all.spark b/resources/ddl/define-all.spark
index 3764ca2..e78a966 100644
--- a/resources/ddl/define-all.spark
+++ b/resources/ddl/define-all.spark
@@ -425,6 +425,30 @@ sqlContext.sql("CREATE TEMPORARY FUNCTION array_intersect AS 'hivemall.tools.arr
 sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS select_k_best")
 sqlContext.sql("CREATE TEMPORARY FUNCTION select_k_best AS 'hivemall.tools.array.SelectKBestUDF'")
 
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS array_append")
+sqlContext.sql("CREATE TEMPORARY FUNCTION array_append AS 'hivemall.tools.array.ArrayAppendUDF'")
+
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS element_at")
+sqlContext.sql("CREATE TEMPORARY FUNCTION element_at AS 'hivemall.tools.array.ArrayElementAtUDF'")
+
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS array_union")
+sqlContext.sql("CREATE TEMPORARY FUNCTION array_union AS 'hivemall.tools.array.ArrayUnionUDF'")
+
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS first_element")
+sqlContext.sql("CREATE TEMPORARY FUNCTION first_element AS 'hivemall.tools.array.FirstElementUDF'")
+
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS last_element")
+sqlContext.sql("CREATE TEMPORARY FUNCTION last_element AS 'hivemall.tools.array.LastElementUDF'")
+
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS array_flatten")
+sqlContext.sql("CREATE TEMPORARY FUNCTION array_flatten AS 'hivemall.tools.array.ArrayFlattenUDF'")
+
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS array_to_str")
+sqlContext.sql("CREATE TEMPORARY FUNCTION array_to_str AS 'hivemall.tools.array.ArrayToStrUDF'")
+
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS conditional_emit")
+sqlContext.sql("CREATE TEMPORARY FUNCTION conditional_emit AS 'hivemall.tools.array.ConditionalEmitUDTF'")
+
 /**
  * Bit operation functions
  */
@@ -467,6 +491,18 @@ sqlContext.sql("CREATE TEMPORARY FUNCTION to_map AS 'hivemall.tools.map.UDAFToMa
 sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS to_ordered_map")
 sqlContext.sql("CREATE TEMPORARY FUNCTION to_ordered_map AS 'hivemall.tools.map.UDAFToOrderedMap'")
 
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS map_include_keys")
+sqlContext.sql("CREATE TEMPORARY FUNCTION map_include_keys AS 'hivemall.tools.map.MapIncludeKeysUDF'")
+
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS map_exclude_keys")
+sqlContext.sql("CREATE TEMPORARY FUNCTION map_exclude_keys AS 'hivemall.tools.map.MapExcludeKeysUDF'")
+
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS map_index")
+sqlContext.sql("CREATE TEMPORARY FUNCTION map_index AS 'hivemall.tools.map.MapIndexUDF'")
+
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS map_key_values")
+sqlContext.sql("CREATE TEMPORARY FUNCTION map_key_values AS 'hivemall.tools.map.MapKeyValuesUDF'")
+
 /**
  * List functions
  */
@@ -485,12 +521,18 @@ sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS l2_norm")
 sqlContext.sql("CREATE TEMPORARY FUNCTION l2_norm AS 'hivemall.tools.math.L2NormUDAF'")
 
 /**
- * Matrix functions
+ * Matrix/Vector functions
  */
 
 sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS transpose_and_dot")
 sqlContext.sql("CREATE TEMPORARY FUNCTION transpose_and_dot AS 'hivemall.tools.matrix.TransposeAndDotUDAF'")
 
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS vector_add")
+sqlContext.sql("CREATE TEMPORARY FUNCTION vector_add AS 'hivemall.tools.vector.VectorAddUDF'")
+
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS vector_dot")
+sqlContext.sql("CREATE TEMPORARY FUNCTION vector_dot AS 'hivemall.tools.vector.VectorDotUDF'")
+
 /**
  * MAPRED functions
  */
@@ -499,6 +541,26 @@ sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS rowid")
 sqlContext.sql("CREATE TEMPORARY FUNCTION rowid AS 'hivemall.tools.mapred.RowIdUDFWrapper'")
 
 /**
+ * JSON functions
+ */
+
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS to_json")
+sqlContext.sql("CREATE TEMPORARY FUNCTION to_json AS 'hivemall.tools.json.ToJsonUDF'")
+
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS from_json")
+sqlContext.sql("CREATE TEMPORARY FUNCTION from_json AS 'hivemall.tools.json.FromJsonUDF'")
+
+/**
+ * Sanity Check functions
+ */
+
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS assert")
+sqlContext.sql("CREATE TEMPORARY FUNCTION assert AS 'hivemall.tools.sanity.AssertUDF'")
+
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS raise_error")
+sqlContext.sql("CREATE TEMPORARY FUNCTION raise_error AS 'hivemall.tools.sanity.RaiseErrorUDF'")
+
+/**
  * MISC functions
  */
 
@@ -514,6 +576,15 @@ sqlContext.sql("CREATE TEMPORARY FUNCTION x_rank AS 'hivemall.tools.RankSequence
 sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS each_top_k")
 sqlContext.sql("CREATE TEMPORARY FUNCTION each_top_k AS 'hivemall.tools.EachTopKUDTF'")
 
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS try_cast")
+sqlContext.sql("CREATE TEMPORARY FUNCTION try_cast AS 'hivemall.tools.TryCastUDF'")
+
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS sessionize")
+sqlContext.sql("CREATE TEMPORARY FUNCTION sessionize AS 'hivemall.tools.datetime.SessionizeUDF'")
+
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS moving_avg")
+sqlContext.sql("CREATE TEMPORARY FUNCTION moving_avg AS 'hivemall.tools.timeseries.MovingAverageUDTF'")
+
 /**
  * Text processing functions
  */
@@ -726,3 +797,25 @@ sqlContext.sql("CREATE TEMPORARY FUNCTION train_slim AS 'hivemall.recommend.Slim
 sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS approx_count_distinct")
 sqlContext.sql("CREATE TEMPORARY FUNCTION approx_count_distinct AS 'hivemall.sketch.hll.ApproxCountDistinctUDAF'")
 
+
+/**
+ * Bloom Filter
+ */
+
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS bloom")
+sqlContext.sql("CREATE TEMPORARY FUNCTION bloom AS 'hivemall.sketch.bloom.BloomFilterUDAF'")
+
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS bloom_and")
+sqlContext.sql("CREATE TEMPORARY FUNCTION bloom_and AS 'hivemall.sketch.bloom.BloomAndUDF'")
+
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS bloom_contains")
+sqlContext.sql("CREATE TEMPORARY FUNCTION bloom_contains AS 'hivemall.sketch.bloom.BloomContainsUDF'")
+
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS bloom_not")
+sqlContext.sql("CREATE TEMPORARY FUNCTION bloom_not AS 'hivemall.sketch.bloom.BloomNotUDF'")
+
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS bloom_or")
+sqlContext.sql("CREATE TEMPORARY FUNCTION bloom_or AS 'hivemall.sketch.bloom.BloomOrUDF'")
+
+sqlContext.sql("DROP TEMPORARY FUNCTION IF EXISTS bloom_contains_any")
+sqlContext.sql("CREATE TEMPORARY FUNCTION bloom_contains_any AS 'hivemall.sketch.bloom.BloomContainsAnyUDF'")

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/resources/ddl/define-udfs.td.hql
----------------------------------------------------------------------
diff --git a/resources/ddl/define-udfs.td.hql b/resources/ddl/define-udfs.td.hql
index b106eda..2352390 100644
--- a/resources/ddl/define-udfs.td.hql
+++ b/resources/ddl/define-udfs.td.hql
@@ -155,7 +155,7 @@ create temporary function train_randomforest_regr as 'hivemall.smile.regression.
 create temporary function tree_predict as 'hivemall.smile.tools.TreePredictUDF';
 create temporary function rf_ensemble as 'hivemall.smile.tools.RandomForestEnsembleUDAF';
 create temporary function guess_attribute_types as 'hivemall.smile.tools.GuessAttributesUDF';
--- since Hivemall v0.5
+-- since Hivemall v0.5.0
 create temporary function changefinder as 'hivemall.anomaly.ChangeFinderUDF';
 create temporary function sst as 'hivemall.anomaly.SingularSpectrumTransformUDF';
 create temporary function train_lda as 'hivemall.topicmodel.LDAUDTF';
@@ -183,7 +183,35 @@ create temporary function train_slim as 'hivemall.recommend.SlimUDTF';
 create temporary function hitrate as 'hivemall.evaluation.HitRateUDAF';
 create temporary function word_ngrams as 'hivemall.tools.text.WordNgramsUDF';
 create temporary function approx_count_distinct as 'hivemall.sketch.hll.ApproxCountDistinctUDAF';
+-- since Hivemall v0.5.2
 create temporary function array_slice as 'hivemall.tools.array.ArraySliceUDF';
+create temporary function try_cast as 'hivemall.tools.TryCastUDF';
+create temporary function array_append as 'hivemall.tools.array.ArrayAppendUDF';
+create temporary function element_at as 'hivemall.tools.array.ArrayElementAtUDF';
+create temporary function array_union as 'hivemall.tools.array.ArrayUnionUDF';
+create temporary function first_element as 'hivemall.tools.array.FirstElementUDF';
+create temporary function last_element as 'hivemall.tools.array.LastElementUDF';
+create temporary function array_flatten as 'hivemall.tools.array.ArrayFlattenUDF';
+create temporary function map_include_keys as 'hivemall.tools.map.MapIncludeKeysUDF';
+create temporary function map_exclude_keys as 'hivemall.tools.map.MapExcludeKeysUDF';
+create temporary function array_to_str as 'hivemall.tools.array.ArrayToStrUDF';
+create temporary function map_index as 'hivemall.tools.map.MapIndexUDF';
+create temporary function map_key_values as 'hivemall.tools.map.MapKeyValuesUDF';
+create temporary function sessionize as 'hivemall.tools.datetime.SessionizeUDF';
+create temporary function to_json as 'hivemall.tools.json.ToJsonUDF';
+create temporary function from_json as 'hivemall.tools.json.FromJsonUDF';
+create temporary function assert as 'hivemall.tools.sanity.AssertUDF';
+create temporary function raise_error as 'hivemall.tools.sanity.RaiseErrorUDF';
+create temporary function moving_avg as 'hivemall.tools.timeseries.MovingAverageUDTF';
+create temporary function vector_add as 'hivemall.tools.vector.VectorAddUDF';
+create temporary function vector_dot as 'hivemall.tools.vector.VectorDotUDF';
+create temporary function bloom as 'hivemall.sketch.bloom.BloomFilterUDAF';
+create temporary function bloom_and as 'hivemall.sketch.bloom.BloomAndUDF';
+create temporary function bloom_contains as 'hivemall.sketch.bloom.BloomContainsUDF';
+create temporary function bloom_not as 'hivemall.sketch.bloom.BloomNotUDF';
+create temporary function bloom_or as 'hivemall.sketch.bloom.BloomOrUDF';
+create temporary function bloom_contains_any as 'hivemall.sketch.bloom.BloomContainsAnyUDF';
+create temporary function conditional_emit as 'hivemall.tools.array.ConditionalEmitUDTF';
 
 -- NLP features
 create temporary function tokenize_ja as 'hivemall.nlp.tokenizer.KuromojiUDF';

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/spark/spark-2.2/pom.xml
----------------------------------------------------------------------
diff --git a/spark/spark-2.2/pom.xml b/spark/spark-2.2/pom.xml
index 100de59..5cb3609 100644
--- a/spark/spark-2.2/pom.xml
+++ b/spark/spark-2.2/pom.xml
@@ -141,7 +141,7 @@
 						<JAVA_HOME>${env.JAVA8_HOME}</JAVA_HOME>
 						<PATH>${env.JAVA8_HOME}/bin:${env.PATH}</PATH>
 					</environmentVariables>
-				</configuration>
+				</configuration>				
 			</plugin>
 		</plugins>
 	</build>

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/tools/hivemall-docs/pom.xml
----------------------------------------------------------------------
diff --git a/tools/hivemall-docs/pom.xml b/tools/hivemall-docs/pom.xml
index 76994d7..99cd138 100644
--- a/tools/hivemall-docs/pom.xml
+++ b/tools/hivemall-docs/pom.xml
@@ -16,7 +16,9 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<modelVersion>4.0.0</modelVersion>
 
 	<parent>
@@ -56,46 +58,94 @@
 			<scope>provided</scope>
 		</dependency>
 
-		<!-- hivemall dependencies -->
+		<!-- compile scope -->
+		<dependency>
+			<groupId>org.apache.hive</groupId>
+			<artifactId>hive-exec</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.reflections</groupId>
+			<artifactId>reflections</artifactId>
+			<version>0.9.10</version>
+			<scope>compile</scope>
+		</dependency>
+
+		<!-- runtime hivemall dependencies using reflection -->
 		<dependency>
 			<groupId>org.apache.hivemall</groupId>
 			<artifactId>hivemall-core</artifactId>
 			<version>${project.version}</version>
-			<scope>compile</scope>
+			<scope>runtime</scope>
 		</dependency>
 		<dependency>
 			<groupId>org.apache.hivemall</groupId>
 			<artifactId>hivemall-nlp</artifactId>
 			<version>${project.version}</version>
-			<scope>compile</scope>
+			<scope>runtime</scope>
 		</dependency>
 		<dependency>
 			<groupId>org.apache.hivemall</groupId>
 			<artifactId>hivemall-xgboost</artifactId>
 			<version>${project.version}</version>
-			<scope>compile</scope>
+			<scope>runtime</scope>
 		</dependency>
 
-		<!-- compile scope -->
-		<dependency>
-			<groupId>org.apache.hive</groupId>
-			<artifactId>hive-exec</artifactId>
-			<scope>compile</scope>
-		</dependency>
-		<dependency>
-			<groupId>com.google.guava</groupId>
-			<artifactId>guava</artifactId>
-			<scope>compile</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.reflections</groupId>
-			<artifactId>reflections</artifactId>
-			<version>0.9.10</version>
-			<scope>compile</scope>
-		</dependency>
 	</dependencies>
 
 	<build>
+		<pluginManagement>
+			<plugins>
+				<!--This plugin's configuration is used to store Eclipse m2e settings
+					only. It has no influence on the Maven build itself. -->
+				<plugin>
+					<groupId>org.eclipse.m2e</groupId>
+					<artifactId>lifecycle-mapping</artifactId>
+					<version>1.0.0</version>
+					<configuration>
+						<lifecycleMappingMetadata>
+							<pluginExecutions>
+								<pluginExecution>
+									<pluginExecutionFilter>
+										<groupId>org.codehaus.plexus</groupId>
+										<artifactId>plexus-component-metadata</artifactId>
+										<versionRange>[1.5.5,)</versionRange>
+										<goals>
+											<goal>generate-metadata</goal>
+										</goals>
+									</pluginExecutionFilter>
+									<action>
+										<execute>
+											<runOnIncremental>false</runOnIncremental>
+										</execute>
+									</action>
+								</pluginExecution>
+								<pluginExecution>
+									<pluginExecutionFilter>
+										<groupId>
+											org.apache.maven.plugins
+										</groupId>
+										<artifactId>
+											maven-plugin-plugin
+										</artifactId>
+										<versionRange>
+											[3.2,)
+										</versionRange>
+										<goals>
+											<goal>descriptor</goal>
+										</goals>
+									</pluginExecutionFilter>
+									<action>
+										<ignore></ignore>
+									</action>
+								</pluginExecution>
+							</pluginExecutions>
+						</lifecycleMappingMetadata>
+					</configuration>
+				</plugin>
+			</plugins>
+		</pluginManagement>
+
 		<plugins>
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
@@ -106,6 +156,12 @@
 						<phase>process-classes</phase>
 					</execution>
 					<execution>
+						<id>mojo-descriptor</id>
+						<goals>
+							<goal>descriptor</goal>
+						</goals>
+					</execution>
+					<execution>
 						<id>generate-helpmojo</id>
 						<goals>
 							<goal>helpmojo</goal>
@@ -113,6 +169,19 @@
 					</execution>
 				</executions>
 			</plugin>
+			<plugin>
+				<groupId>org.codehaus.plexus</groupId>
+				<artifactId>plexus-component-metadata</artifactId>
+				<version>1.7.1</version>
+				<executions>
+					<execution>
+						<goals>
+							<goal>generate-metadata</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
 		</plugins>
 	</build>
+
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/tools/hivemall-docs/src/main/java/hivemall/docs/FuncsListGenerator.java
----------------------------------------------------------------------
diff --git a/tools/hivemall-docs/src/main/java/hivemall/docs/FuncsListGenerator.java b/tools/hivemall-docs/src/main/java/hivemall/docs/FuncsListGenerator.java
deleted file mode 100644
index 61fea68..0000000
--- a/tools/hivemall-docs/src/main/java/hivemall/docs/FuncsListGenerator.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- * 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 hivemall.docs;
-
-import static hivemall.docs.utils.MarkdownUtils.asCodeBlock;
-import static hivemall.docs.utils.MarkdownUtils.asInlineCode;
-import static hivemall.docs.utils.MarkdownUtils.asListElement;
-import static hivemall.docs.utils.MarkdownUtils.indent;
-import static org.apache.commons.lang.StringEscapeUtils.escapeHtml;
-
-import hivemall.utils.lang.StringUtils;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.annotation.Nonnull;
-
-import org.apache.hadoop.hive.ql.exec.Description;
-import org.apache.maven.execution.MavenSession;
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.reflections.Reflections;
-
-/**
- * Generate a list of UDFs for documentation.
- *
- * @link https://hivemall.incubator.apache.org/userguide/misc/generic_funcs.html
- * @link https://hivemall.incubator.apache.org/userguide/misc/funcs.html
- */
-@Mojo(name = "generate-funcs-list")
-public class FuncsListGenerator extends AbstractMojo {
-
-    @Parameter(defaultValue = "${basedir}", readonly = true)
-    private File basedir;
-
-    @Parameter(defaultValue = "${session}", readonly = true)
-    private MavenSession session;
-
-    @Parameter(defaultValue = "docs/gitbook/misc/generic_funcs.md")
-    private String pathToGenericFuncs;
-
-    @Parameter(defaultValue = "docs/gitbook/misc/funcs.md")
-    private String pathToFuncs;
-
-    private static final Map<String, List<String>> genericFuncsHeaders = new LinkedHashMap<>();
-    static {
-        genericFuncsHeaders.put("# Array",
-            Arrays.asList("hivemall.tools.array", "hivemall.tools.list"));
-        genericFuncsHeaders.put("# Map", Collections.singletonList("hivemall.tools.map"));
-        genericFuncsHeaders.put("# Bitset", Collections.singletonList("hivemall.tools.bits"));
-        genericFuncsHeaders.put("# Compression",
-            Collections.singletonList("hivemall.tools.compress"));
-        genericFuncsHeaders.put("# MapReduce", Collections.singletonList("hivemall.tools.mapred"));
-        genericFuncsHeaders.put("# Math", Collections.singletonList("hivemall.tools.math"));
-        genericFuncsHeaders.put("# Matrix", Collections.singletonList("hivemall.tools.matrix"));
-        genericFuncsHeaders.put("# Text processing",
-            Collections.singletonList("hivemall.tools.text"));
-        genericFuncsHeaders.put("# Others", Collections.singletonList("hivemall.tools"));
-    }
-
-    private static final Map<String, List<String>> funcsHeaders = new LinkedHashMap<>();
-    static {
-        funcsHeaders.put("# Regression", Collections.singletonList("hivemall.regression"));
-        funcsHeaders.put("# Classification", Collections.<String>emptyList());
-        funcsHeaders.put("## Binary classification",
-            Collections.singletonList("hivemall.classifier"));
-        funcsHeaders.put("## Multiclass classification",
-            Collections.singletonList("hivemall.classifier.multiclass"));
-        funcsHeaders.put("# Matrix factorization", Collections.singletonList("hivemall.mf"));
-        funcsHeaders.put("# Factorization machines", Collections.singletonList("hivemall.fm"));
-        funcsHeaders.put("# Recommendation", Collections.singletonList("hivemall.recommend"));
-        funcsHeaders.put("# Anomaly detection", Collections.singletonList("hivemall.anomaly"));
-        funcsHeaders.put("# Topic modeling", Collections.singletonList("hivemall.topicmodel"));
-        funcsHeaders.put("# Preprocessing", Collections.singletonList("hivemall.ftvec"));
-        funcsHeaders.put("## Data amplification",
-            Collections.singletonList("hivemall.ftvec.amplify"));
-        funcsHeaders.put("## Feature binning", Collections.singletonList("hivemall.ftvec.binning"));
-        funcsHeaders.put("## Feature format conversion",
-            Collections.singletonList("hivemall.ftvec.conv"));
-        funcsHeaders.put("## Feature hashing", Collections.singletonList("hivemall.ftvec.hashing"));
-        funcsHeaders.put("## Feature paring", Collections.singletonList("hivemall.ftvec.pairing"));
-        funcsHeaders.put("## Ranking", Collections.singletonList("hivemall.ftvec.ranking"));
-        funcsHeaders.put("## Feature scaling", Collections.singletonList("hivemall.ftvec.scaling"));
-        funcsHeaders.put("## Feature selection",
-            Collections.singletonList("hivemall.ftvec.selection"));
-        funcsHeaders.put("## Feature transformation and vectorization",
-            Collections.singletonList("hivemall.ftvec.trans"));
-        funcsHeaders.put("# Geospatial functions",
-            Collections.singletonList("hivemall.geospatial"));
-        funcsHeaders.put("# Distance measures", Collections.singletonList("hivemall.knn.distance"));
-        funcsHeaders.put("# Locality-sensitive hashing",
-            Collections.singletonList("hivemall.knn.lsh"));
-        funcsHeaders.put("# Similarity measures",
-            Collections.singletonList("hivemall.knn.similarity"));
-        funcsHeaders.put("# Evaluation", Collections.singletonList("hivemall.evaluation"));
-        funcsHeaders.put("# Sketching", Collections.singletonList("hivemall.sketch.hll"));
-        funcsHeaders.put("# Ensemble learning", Collections.singletonList("hivemall.ensemble"));
-        funcsHeaders.put("## Bagging", Collections.singletonList("hivemall.ensemble.bagging"));
-        funcsHeaders.put("# Decision trees and RandomForest", Arrays.asList(
-            "hivemall.smile.classification", "hivemall.smile.regression", "hivemall.smile.tools"));
-        funcsHeaders.put("# XGBoost", Arrays.asList("hivemall.xgboost.classification",
-            "hivemall.xgboost.regression", "hivemall.xgboost.tools"));
-        funcsHeaders.put("# Others",
-            Arrays.asList("hivemall", "hivemall.dataset", "hivemall.ftvec.text"));
-    }
-
-    @Override
-    public void execute() throws MojoExecutionException {
-        if (!isReactorRootProject()) {
-            // output only once across the projects
-            return;
-        }
-
-        generate(new File(basedir, pathToGenericFuncs),
-            "This page describes a list of useful Hivemall generic functions. See also a [list of machine-learning-related functions](./funcs.md).",
-            genericFuncsHeaders);
-        generate(new File(basedir, pathToFuncs),
-            "This page describes a list of Hivemall functions. See also a [list of generic Hivemall functions](./generic_funcs.md) for more general-purpose functions such as array and map UDFs.",
-            funcsHeaders);
-    }
-
-    private boolean isReactorRootProject() {
-        return session.getExecutionRootDirectory().equalsIgnoreCase(basedir.toString());
-    }
-
-    private void generate(@Nonnull File outputFile, @Nonnull String preface,
-            @Nonnull Map<String, List<String>> headers) throws MojoExecutionException {
-        Reflections reflections = new Reflections("hivemall");
-        Set<Class<?>> annotatedClasses = reflections.getTypesAnnotatedWith(Description.class);
-
-        StringBuilder sb = new StringBuilder();
-        Map<String, Set<String>> packages = new HashMap<>();
-
-        Pattern func = Pattern.compile("_FUNC_(\\(.*?\\))(.*)", Pattern.DOTALL);
-
-        for (Class<?> annotatedClass : annotatedClasses) {
-            Deprecated deprecated = annotatedClass.getAnnotation(Deprecated.class);
-            if (deprecated != null) {
-                continue;
-            }
-
-            Description description = annotatedClass.getAnnotation(Description.class);
-
-            String value = description.value().replaceAll("\n", " ");
-            Matcher matcher = func.matcher(value);
-            if (matcher.find()) {
-                value = asInlineCode(description.name() + matcher.group(1))
-                        + escapeHtml(matcher.group(2));
-            }
-            sb.append(asListElement(value));
-
-            StringBuilder sbExtended = new StringBuilder();
-            if (!description.extended().isEmpty()) {
-                sbExtended.append(description.extended());
-                sb.append("\n");
-            }
-
-            String extended = sbExtended.toString();
-            if (extended.isEmpty()) {
-                sb.append("\n");
-            } else {
-                if (extended.toLowerCase().contains("select")) { // extended description contains SQL statements
-                    sb.append(indent(asCodeBlock(extended, "sql")));
-                } else {
-                    sb.append(indent(asCodeBlock(extended)));
-                }
-            }
-
-            String packageName = annotatedClass.getPackage().getName();
-            if (!packages.containsKey(packageName)) {
-                Set<String> set = new TreeSet<>();
-                packages.put(packageName, set);
-            }
-            Set<String> List = packages.get(packageName);
-            List.add(sb.toString());
-
-            StringUtils.clear(sb);
-        }
-
-        try (PrintWriter writer = new PrintWriter(outputFile)) {
-            // license header
-            writer.println("<!--");
-            try {
-                File licenseFile = new File(basedir, "resources/license-header.txt");
-                FileReader fileReader = new FileReader(licenseFile);
-
-                try (BufferedReader bufferedReader = new BufferedReader(fileReader)) {
-                    String line;
-                    while ((line = bufferedReader.readLine()) != null) {
-                        writer.println(indent(line));
-                    }
-                }
-            } catch (IOException e) {
-                throw new MojoExecutionException("Failed to read license file");
-            }
-            writer.println("-->\n");
-
-            writer.println(preface);
-
-            writer.println("\n<!-- toc -->\n");
-
-            for (Map.Entry<String, List<String>> e : headers.entrySet()) {
-                writer.println(e.getKey() + "\n");
-                List<String> packageNames = e.getValue();
-                for (String packageName : packageNames) {
-                    for (String desc : packages.get(packageName)) {
-                        writer.println(desc);
-                    }
-                }
-            }
-
-            writer.flush();
-        } catch (FileNotFoundException e) {
-            throw new MojoExecutionException("Output file is not found");
-        }
-    }
-}


[4/4] incubator-hivemall git commit: [HIVEMALL-145] Merge Brickhouse functions

Posted by my...@apache.org.
[HIVEMALL-145] Merge Brickhouse functions

## What changes were proposed in this pull request?

Merge [brickhouse](https://github.com/klout/brickhouse) functions.

## What type of PR is it?

Feature

## What is the Jira issue?

https://issues.apache.org/jira/browse/HIVEMALL-145

## How was this patch tested?

unit tests and manual tests

## How to use this feature?

as described in [user guide](http://hivemall.incubator.apache.org/userguide/misc/generic_funcs.html).

## Checklist

- [x] Did you apply source code formatter, i.e., `mvn formatter:format`, for your commit?
- [x] Did you run system tests on Hive (or Spark)?
- [x] Invite active/main Brickhouse developers as Hivemall PPMC members or committers.
https://github.com/klout/brickhouse/issues/149
- [x] +1 from Klout members to merge

Author: Makoto Yui <my...@apache.org>

Closes #135 from myui/merge_brickhouse.


Project: http://git-wip-us.apache.org/repos/asf/incubator-hivemall/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-hivemall/commit/49496032
Tree: http://git-wip-us.apache.org/repos/asf/incubator-hivemall/tree/49496032
Diff: http://git-wip-us.apache.org/repos/asf/incubator-hivemall/diff/49496032

Branch: refs/heads/master
Commit: 49496032498182baa60e5f93a1f3717359909433
Parents: 7ea6bfd
Author: Makoto Yui <my...@apache.org>
Authored: Wed Jun 6 18:09:17 2018 +0900
Committer: Makoto Yui <my...@apache.org>
Committed: Wed Jun 6 18:09:17 2018 +0900

----------------------------------------------------------------------
 NOTICE                                          |   2 +-
 bin/update_func_md.sh                           |  47 ++
 .../main/java/hivemall/HivemallVersionUDF.java  |   2 +-
 .../java/hivemall/sketch/bloom/BloomAndUDF.java |   3 +-
 .../sketch/bloom/BloomContainsAnyUDF.java       | 111 ++++
 .../hivemall/sketch/bloom/BloomContainsUDF.java |  85 ++-
 .../hivemall/sketch/bloom/BloomFilterUDAF.java  | 114 ++++
 .../java/hivemall/sketch/bloom/BloomNotUDF.java |   3 +-
 .../java/hivemall/sketch/bloom/BloomOrUDF.java  |   3 +-
 .../java/hivemall/sketch/bloom/BloomUDAF.java   | 101 ----
 .../smile/classification/DecisionTree.java      |   6 +-
 .../smile/regression/RegressionTree.java        |  10 +-
 .../hivemall/smile/tools/TreePredictUDF.java    |   2 +-
 .../hivemall/statistics/MovingAverageUDTF.java  |  84 ---
 .../java/hivemall/tools/GenerateSeriesUDTF.java | 190 +++++--
 .../main/java/hivemall/tools/TryCastUDF.java    |   4 +-
 .../hivemall/tools/array/ArrayAppendUDF.java    |  11 +-
 .../hivemall/tools/array/ArrayConcatUDF.java    |   6 +-
 .../hivemall/tools/array/ArrayElementAtUDF.java |   4 +-
 .../hivemall/tools/array/ArrayFlattenUDF.java   |  39 +-
 .../hivemall/tools/array/ArrayIntersectUDF.java |   7 +-
 .../hivemall/tools/array/ArrayRemoveUDF.java    |   4 +-
 .../hivemall/tools/array/ArraySliceUDF.java     |  41 +-
 .../hivemall/tools/array/ArrayToStrUDF.java     |  96 ++++
 .../hivemall/tools/array/ArrayUnionUDF.java     |   8 +-
 .../tools/array/ConditionalEmitUDTF.java        |  19 +-
 .../hivemall/tools/array/FirstElementUDF.java   |   4 +-
 .../hivemall/tools/array/LastElementUDF.java    |   3 +-
 .../tools/array/SortAndUniqArrayUDF.java        |   2 +-
 .../tools/array/SubarrayEndWithUDF.java         |   2 +-
 .../tools/array/SubarrayStartWithUDF.java       |   2 +-
 .../java/hivemall/tools/bits/BitsORUDF.java     |   4 +-
 .../java/hivemall/tools/bits/ToBitsUDF.java     |   2 +-
 .../java/hivemall/tools/bits/UnBitsUDF.java     |   2 +-
 .../hivemall/tools/compress/DeflateUDF.java     |   2 +-
 .../hivemall/tools/compress/InflateUDF.java     |   4 +-
 .../hivemall/tools/datetime/SessionizeUDF.java  |  99 ++++
 .../java/hivemall/tools/json/FromJsonUDF.java   |  40 +-
 .../java/hivemall/tools/json/ToJsonUDF.java     |  76 ++-
 .../hivemall/tools/list/UDAFToOrderedList.java  |  16 +-
 .../hivemall/tools/map/MapExcludeKeysUDF.java   | 100 ++++
 .../hivemall/tools/map/MapIncludeKeysUDF.java   | 103 ++++
 .../java/hivemall/tools/map/MapIndexUDF.java    | 104 ++++
 .../hivemall/tools/map/MapKeyValuesUDF.java     |  97 ++++
 .../java/hivemall/tools/map/MergeMapsUDAF.java  | 172 ++++++
 .../hivemall/tools/mapred/RowNumberUDF.java     |   4 +-
 .../java/hivemall/tools/sanity/AssertUDF.java   |   6 +-
 .../hivemall/tools/sanity/RaiseErrorUDF.java    |  43 +-
 .../java/hivemall/tools/text/Base91UDF.java     |   2 +-
 .../tools/text/NormalizeUnicodeUDF.java         |   4 +-
 .../hivemall/tools/text/SingularizeUDF.java     |   2 +-
 .../java/hivemall/tools/text/SplitWordsUDF.java |   2 +-
 .../java/hivemall/tools/text/Unbase91UDF.java   |   4 +-
 .../java/hivemall/tools/text/WordNgramsUDF.java |   4 +-
 .../tools/timeseries/MovingAverageUDTF.java     |  98 ++++
 .../hivemall/tools/vector/VectorAddUDF.java     |   3 +-
 .../hivemall/tools/vector/VectorDotUDF.java     |  21 +-
 .../java/hivemall/utils/hadoop/HiveUtils.java   |   2 +-
 .../java/hivemall/utils/math/MatrixUtils.java   |   7 +-
 .../FieldAwareFactorizationMachineUDTFTest.java |   2 +
 .../ftvec/hashing/FeatureHashingUDFTest.java    |   6 +-
 .../smile/classification/DecisionTreeTest.java  |  10 +-
 .../smile/regression/RegressionTreeTest.java    |   5 +-
 .../statistics/MovingAverageUDTFTest.java       |  78 ---
 .../hivemall/tools/GenerateSeriesUDTFTest.java  | 246 +++++++++
 .../tools/array/ArrayAppendUDFTest.java         |   9 +-
 .../tools/array/ArrayFlattenUDFTest.java        |   4 +-
 .../hivemall/tools/array/ArraySliceUDFTest.java |   4 +-
 .../hivemall/tools/array/ArrayToStrUDFTest.java | 103 ++++
 .../hivemall/tools/array/ArrayUnionUDFTest.java |   1 +
 .../tools/array/ConditionalEmitUDTFTest.java    |   3 +-
 .../tools/datetime/SessionizeUDFTest.java       |  76 +++
 .../hivemall/tools/json/FromJsonUDFTest.java    |   1 +
 .../java/hivemall/tools/json/ToJsonUDFTest.java |   6 +-
 .../hivemall/tools/map/MapKeyValuesUDFTest.java |  81 +++
 .../tools/sanity/RaiseErrorUDFTest.java         |  10 +-
 .../tools/timeseries/MovingAverageUDTFTest.java |  80 +++
 .../hivemall/tools/vector/VectorAddUDFTest.java |   1 +
 .../hivemall/tools/vector/VectorDotUDFTest.java |   7 +-
 docs/gitbook/misc/funcs.md                      |  80 ++-
 docs/gitbook/misc/generic_funcs.md              | 531 +++++++++++++++----
 pom.xml                                         |  12 +
 resources/ddl/define-all-as-permanent.hive      |  99 +++-
 resources/ddl/define-all.hive                   |  99 +++-
 resources/ddl/define-all.spark                  |  95 +++-
 resources/ddl/define-udfs.td.hql                |  30 +-
 spark/spark-2.2/pom.xml                         |   2 +-
 tools/hivemall-docs/pom.xml                     | 113 +++-
 .../java/hivemall/docs/FuncsListGenerator.java  | 249 ---------
 .../hivemall/docs/FuncsListGeneratorMojo.java   | 264 +++++++++
 ...rojectDependenciesComponentConfigurator.java | 100 ++++
 91 files changed, 3621 insertions(+), 824 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/NOTICE
----------------------------------------------------------------------
diff --git a/NOTICE b/NOTICE
index 385a198..b4e5ace 100644
--- a/NOTICE
+++ b/NOTICE
@@ -10,4 +10,4 @@ the following organizations and individuals:
  - Copyright 2013-2015 National Institute of Advanced Industrial Science and Technology (AIST)
  - Copyright 2015-2016 Makoto Yui
  - Copyright 2015-2016 Treasure Data, Inc.
- - Copyright 2012 Klout, Inc.
\ No newline at end of file
+ - Copyright 2012 Klout, Inc.

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/bin/update_func_md.sh
----------------------------------------------------------------------
diff --git a/bin/update_func_md.sh b/bin/update_func_md.sh
new file mode 100755
index 0000000..bb0afda
--- /dev/null
+++ b/bin/update_func_md.sh
@@ -0,0 +1,47 @@
+#!/bin/sh
+#
+# 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.
+#
+
+if [ "$HIVEMALL_HOME" = "" ]; then
+    if [ -e ../bin/${0##*/} ]; then
+	HIVEMALL_HOME=".."
+    elif [ -e ./bin/${0##*/} ]; then
+	HIVEMALL_HOME="."
+    else
+	echo "env HIVEMALL_HOME not defined"
+	exit 1
+    fi
+fi
+
+cd $HIVEMALL_HOME
+HIVEMALL_HOME=`pwd`
+
+# Deploy to local Maven repos
+
+export MAVEN_OPTS=-XX:MaxPermSize=256m
+mvn clean install -DskipTests=true -Dmaven.test.skip=true -pl '.,core,nlp,xgboost,tools/hivemall-docs'
+
+# Generate docs
+
+mvn org.apache.hivemall:hivemall-docs:generate-funcs-list -pl '.,core,nlp,xgboost,tools/hivemall-docs' -X
+
+# Run HTTP server on localhost:040
+
+cd ${HIVEMALL_HOME}/docs/gitbook
+gitbook install && gitbook serve

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/HivemallVersionUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/HivemallVersionUDF.java b/core/src/main/java/hivemall/HivemallVersionUDF.java
index c42701f..92636d5 100644
--- a/core/src/main/java/hivemall/HivemallVersionUDF.java
+++ b/core/src/main/java/hivemall/HivemallVersionUDF.java
@@ -24,7 +24,7 @@ import org.apache.hadoop.hive.ql.udf.UDFType;
 import org.apache.hadoop.io.Text;
 
 @Description(name = "hivemall_version", value = "_FUNC_() - Returns the version of Hivemall",
-        extended = "Usage: SELECT hivemall_version();")
+        extended = "SELECT hivemall_version();")
 @UDFType(deterministic = true, stateful = false)
 public final class HivemallVersionUDF extends UDF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/sketch/bloom/BloomAndUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/sketch/bloom/BloomAndUDF.java b/core/src/main/java/hivemall/sketch/bloom/BloomAndUDF.java
index 87769da..f723acd 100644
--- a/core/src/main/java/hivemall/sketch/bloom/BloomAndUDF.java
+++ b/core/src/main/java/hivemall/sketch/bloom/BloomAndUDF.java
@@ -31,7 +31,8 @@ import org.apache.hadoop.util.bloom.DynamicBloomFilter;
 import org.apache.hadoop.util.bloom.Filter;
 
 @Description(name = "bloom_and",
-        value = "_FUNC_(string bloom1, string bloom2) - Returns the logical AND of two bloom filters")
+        value = "_FUNC_(string bloom1, string bloom2) - Returns the logical AND of two bloom filters",
+        extended = "SELECT bloom_and(bf1, bf2) FROM xxx;")
 @UDFType(deterministic = true, stateful = false)
 public final class BloomAndUDF extends UDF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/sketch/bloom/BloomContainsAnyUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/sketch/bloom/BloomContainsAnyUDF.java b/core/src/main/java/hivemall/sketch/bloom/BloomContainsAnyUDF.java
new file mode 100644
index 0000000..d8ff28b
--- /dev/null
+++ b/core/src/main/java/hivemall/sketch/bloom/BloomContainsAnyUDF.java
@@ -0,0 +1,111 @@
+/*
+ * 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 hivemall.sketch.bloom;
+
+import java.io.IOException;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import org.apache.hadoop.hive.ql.exec.Description;
+import org.apache.hadoop.hive.ql.exec.UDF;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.udf.UDFType;
+import org.apache.hadoop.io.Text;
+import org.apache.hadoop.util.bloom.DynamicBloomFilter;
+import org.apache.hadoop.util.bloom.Filter;
+import org.apache.hadoop.util.bloom.Key;
+
+//@formatter:off
+@Description(name = "bloom_contains_any",
+        value = "_FUNC_(string bloom, string key) or _FUNC_(string bloom, array<string> keys)"
+                + "- Returns true if the bloom filter contains any of the given key",
+        extended = "WITH data1 as (\n" + 
+                "  SELECT explode(array(1,2,3,4,5)) as id\n" + 
+                "),\n" + 
+                "data2 as (\n" + 
+                "  SELECT explode(array(1,3,5,6,8)) as id\n" + 
+                "),\n" + 
+                "bloom as (\n" + 
+                "  SELECT bloom(id) as bf\n" + 
+                "  FROM data1\n" + 
+                ")\n" + 
+                "SELECT \n" + 
+                "  l.* \n" + 
+                "FROM \n" + 
+                "  data2 l\n" + 
+                "  CROSS JOIN bloom r\n" + 
+                "WHERE\n" + 
+                "  bloom_contains_any(r.bf, array(l.id))")
+//@formatter:on
+@UDFType(deterministic = true, stateful = false)
+public final class BloomContainsAnyUDF extends UDF {
+
+    @Nonnull
+    private final Key key = new Key();
+
+    @Nullable
+    private Text prevBfStr;
+    @Nullable
+    private Filter prevBf;
+
+    @Nullable
+    public Boolean evaluate(@Nullable Text bloomStr, @Nullable List<Text> keys)
+            throws HiveException {
+        if (bloomStr == null) {
+            return null;
+        }
+        if (keys == null) {
+            return Boolean.FALSE;
+        }
+
+        final Filter bloom = getFilter(bloomStr);
+
+        for (Text keyStr : keys) {
+            if (keyStr == null) {
+                continue;
+            }
+            key.set(keyStr.copyBytes(), 1.0d);
+            if (bloom.membershipTest(key)) {
+                return Boolean.TRUE;
+            }
+        }
+
+        return Boolean.FALSE;
+    }
+
+    @Nonnull
+    private Filter getFilter(@Nonnull final Text bloomStr) throws HiveException {
+        final Filter bloom;
+        if (prevBf != null && prevBfStr.equals(bloomStr)) {
+            bloom = prevBf;
+        } else {
+            try {
+                bloom = BloomFilterUtils.deserialize(bloomStr, new DynamicBloomFilter());
+            } catch (IOException e) {
+                throw new HiveException(e);
+            }
+            this.prevBfStr = new Text(bloomStr);
+            this.prevBf = bloom;
+        }
+        return bloom;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/sketch/bloom/BloomContainsUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/sketch/bloom/BloomContainsUDF.java b/core/src/main/java/hivemall/sketch/bloom/BloomContainsUDF.java
index 2da65b3..f76b85d 100644
--- a/core/src/main/java/hivemall/sketch/bloom/BloomContainsUDF.java
+++ b/core/src/main/java/hivemall/sketch/bloom/BloomContainsUDF.java
@@ -19,6 +19,7 @@
 package hivemall.sketch.bloom;
 
 import java.io.IOException;
+import java.util.List;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -32,8 +33,37 @@ import org.apache.hadoop.util.bloom.DynamicBloomFilter;
 import org.apache.hadoop.util.bloom.Filter;
 import org.apache.hadoop.util.bloom.Key;
 
+//@formatter:off
 @Description(name = "bloom_contains",
-        value = "_FUNC_(string bloom, string key) - Returns true if the bloom filter contains the given key")
+        value = "_FUNC_(string bloom, string key) or _FUNC_(string bloom, array<string> keys)"
+                + " - Returns true if the bloom filter contains all the given key(s). Returns false if key is null.",
+        extended = "WITH satisfied_movies as (\n" + 
+                "  SELECT bloom(movieid) as movies\n" + 
+                "  FROM (\n" + 
+                "    SELECT movieid\n" + 
+                "    FROM ratings\n" + 
+                "    GROUP BY movieid\n" + 
+                "    HAVING avg(rating) >= 4.0\n" + 
+                "  ) t\n" + 
+                ")\n" + 
+                "SELECT\n" + 
+                "  l.rating,\n" + 
+                "  count(distinct l.userid) as cnt\n" + 
+                "FROM\n" + 
+                "  ratings l \n" + 
+                "  CROSS JOIN satisfied_movies r\n" + 
+                "WHERE\n" + 
+                "  bloom_contains(r.movies, l.movieid) -- includes false positive\n" + 
+                "GROUP BY \n" + 
+                "  l.rating;\n" + 
+                "\n" + 
+                "l.rating        cnt\n" + 
+                "1       1296\n" + 
+                "2       2770\n" + 
+                "3       5008\n" + 
+                "4       5824\n" + 
+                "5       5925")
+//@formatter:on
 @UDFType(deterministic = true, stateful = false)
 public final class BloomContainsUDF extends UDF {
 
@@ -41,31 +71,64 @@ public final class BloomContainsUDF extends UDF {
     private final Key key = new Key();
 
     @Nullable
-    private Text prevKey;
+    private Text prevBfStr;
     @Nullable
-    private Filter prevFilter;
+    private Filter prevBf;
 
     @Nullable
     public Boolean evaluate(@Nullable Text bloomStr, @Nullable Text keyStr) throws HiveException {
-        if (bloomStr == null || key == null) {
+        if (bloomStr == null) {
             return null;
         }
+        if (keyStr == null) {
+            return Boolean.FALSE;
+        }
+
+        Filter bloom = getFilter(bloomStr);
+        key.set(keyStr.copyBytes(), 1.0d);
+        return Boolean.valueOf(bloom.membershipTest(key));
+    }
+
+    @Nullable
+    public Boolean evaluate(@Nullable Text bloomStr, @Nullable List<Text> keys)
+            throws HiveException {
+        if (bloomStr == null) {
+            return null;
+        }
+        if (keys == null) {
+            return Boolean.FALSE;
+        }
+
+        final Filter bloom = getFilter(bloomStr);
 
+        for (Text keyStr : keys) {
+            if (keyStr == null) {
+                continue;
+            }
+            key.set(keyStr.copyBytes(), 1.0d);
+            if (bloom.membershipTest(key) == false) {
+                return Boolean.FALSE;
+            }
+        }
+
+        return Boolean.TRUE;
+    }
+
+    @Nonnull
+    private Filter getFilter(@Nonnull final Text bloomStr) throws HiveException {
         final Filter bloom;
-        if (prevFilter != null && prevKey.equals(keyStr)) {
-            bloom = prevFilter;
+        if (prevBf != null && prevBfStr.equals(bloomStr)) {
+            bloom = prevBf;
         } else {
             try {
                 bloom = BloomFilterUtils.deserialize(bloomStr, new DynamicBloomFilter());
             } catch (IOException e) {
                 throw new HiveException(e);
             }
-            this.prevKey = keyStr;
-            this.prevFilter = bloom;
-            key.set(keyStr.getBytes(), 1.0d);
+            this.prevBfStr = new Text(bloomStr);
+            this.prevBf = bloom;
         }
-
-        return Boolean.valueOf(bloom.membershipTest(key));
+        return bloom;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/sketch/bloom/BloomFilterUDAF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/sketch/bloom/BloomFilterUDAF.java b/core/src/main/java/hivemall/sketch/bloom/BloomFilterUDAF.java
new file mode 100644
index 0000000..a76a60c
--- /dev/null
+++ b/core/src/main/java/hivemall/sketch/bloom/BloomFilterUDAF.java
@@ -0,0 +1,114 @@
+/*
+ * 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 hivemall.sketch.bloom;
+
+import java.io.IOException;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import org.apache.hadoop.hive.ql.exec.Description;
+import org.apache.hadoop.hive.ql.exec.UDAF;
+import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.io.Text;
+import org.apache.hadoop.util.bloom.DynamicBloomFilter;
+import org.apache.hadoop.util.bloom.Filter;
+import org.apache.hadoop.util.bloom.Key;
+
+//@formatter:off
+@Description(name = "bloom",
+        value = "_FUNC_(string key) - Constructs a BloomFilter by aggregating a set of keys",
+        extended = "CREATE TABLE satisfied_movies AS \n" + 
+                "  SELECT bloom(movieid) as movies\n" + 
+                "  FROM (\n" + 
+                "    SELECT movieid\n" + 
+                "    FROM ratings\n" + 
+                "    GROUP BY movieid\n" + 
+                "    HAVING avg(rating) >= 4.0\n" + 
+                "  ) t;")
+//@formatter:on
+@SuppressWarnings("deprecation")
+public final class BloomFilterUDAF extends UDAF {
+
+    public static class Evaluator implements UDAFEvaluator {
+
+        private Filter filter;
+        private Key key;
+
+        @Override
+        public void init() {
+            this.filter = BloomFilterUtils.newDynamicBloomFilter();
+            this.key = new Key();
+        }
+
+        public boolean iterate(@Nullable Text keyStr) {
+            if (keyStr == null) {
+                return true;
+            }
+            if (filter == null) {
+                init();
+            }
+
+            key.set(keyStr.copyBytes(), 1.0d);
+            filter.add(key);
+
+            return true;
+        }
+
+        @Nonnull
+        public Text terminatePartial() throws HiveException {
+            try {
+                return BloomFilterUtils.serialize(filter, new Text());
+            } catch (IOException e) {
+                throw new HiveException(e);
+            }
+        }
+
+        public boolean merge(@Nonnull Text partial) throws HiveException {
+            final DynamicBloomFilter other;
+            try {
+                other = BloomFilterUtils.deserialize(partial, new DynamicBloomFilter());
+            } catch (IOException e) {
+                throw new HiveException(e);
+            }
+
+            if (filter == null) {
+                this.filter = other;
+            } else {
+                filter.or(other);
+            }
+            return true;
+        }
+
+        @Nullable
+        public Text terminate() throws HiveException {
+            if (filter == null) {
+                return null;
+            }
+
+            try {
+                return BloomFilterUtils.serialize(filter, new Text());
+            } catch (IOException e) {
+                throw new HiveException(e);
+            }
+        }
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/sketch/bloom/BloomNotUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/sketch/bloom/BloomNotUDF.java b/core/src/main/java/hivemall/sketch/bloom/BloomNotUDF.java
index cd385e3..1a074b0 100644
--- a/core/src/main/java/hivemall/sketch/bloom/BloomNotUDF.java
+++ b/core/src/main/java/hivemall/sketch/bloom/BloomNotUDF.java
@@ -31,7 +31,8 @@ import org.apache.hadoop.util.bloom.DynamicBloomFilter;
 import org.apache.hadoop.util.bloom.Filter;
 
 @Description(name = "bloom_not",
-        value = "_FUNC_(string bloom) - Returns the logical NOT of a bloom filters")
+        value = "_FUNC_(string bloom) - Returns the logical NOT of a bloom filters",
+        extended = "SELECT bloom_not(bf) FROM xxx;")
 @UDFType(deterministic = true, stateful = false)
 public final class BloomNotUDF extends UDF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/sketch/bloom/BloomOrUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/sketch/bloom/BloomOrUDF.java b/core/src/main/java/hivemall/sketch/bloom/BloomOrUDF.java
index 7d2980e..0fcb539 100644
--- a/core/src/main/java/hivemall/sketch/bloom/BloomOrUDF.java
+++ b/core/src/main/java/hivemall/sketch/bloom/BloomOrUDF.java
@@ -31,7 +31,8 @@ import org.apache.hadoop.util.bloom.DynamicBloomFilter;
 import org.apache.hadoop.util.bloom.Filter;
 
 @Description(name = "bloom_or",
-        value = "_FUNC_(string bloom1, string bloom2) - Returns the logical OR of two bloom filters")
+        value = "_FUNC_(string bloom1, string bloom2) - Returns the logical OR of two bloom filters",
+        extended = "SELECT bloom_or(bf1, bf2) FROM xxx;")
 @UDFType(deterministic = true, stateful = false)
 public final class BloomOrUDF extends UDF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/sketch/bloom/BloomUDAF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/sketch/bloom/BloomUDAF.java b/core/src/main/java/hivemall/sketch/bloom/BloomUDAF.java
deleted file mode 100644
index cb09b93..0000000
--- a/core/src/main/java/hivemall/sketch/bloom/BloomUDAF.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * 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 hivemall.sketch.bloom;
-
-import java.io.IOException;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-import org.apache.hadoop.hive.ql.exec.Description;
-import org.apache.hadoop.hive.ql.exec.UDAF;
-import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
-import org.apache.hadoop.hive.ql.metadata.HiveException;
-import org.apache.hadoop.io.Text;
-import org.apache.hadoop.util.bloom.DynamicBloomFilter;
-import org.apache.hadoop.util.bloom.Filter;
-import org.apache.hadoop.util.bloom.Key;
-
-@Description(name = "bloom",
-        value = "_FUNC_(string key) - Constructs a BloomFilter by aggregating a set of keys")
-@SuppressWarnings("deprecation")
-public final class BloomUDAF extends UDAF {
-
-    public static class Evaluator implements UDAFEvaluator {
-
-        private Filter filter;
-        private Key key;
-
-        @Override
-        public void init() {
-            this.filter = BloomFilterUtils.newDynamicBloomFilter();
-            this.key = new Key();
-        }
-
-        public boolean iterate(@Nullable Text keyStr) {
-            if (keyStr == null) {
-                return true;
-            }
-            key.set(keyStr.getBytes(), 1.0d);
-
-            filter.add(key);
-
-            return true;
-        }
-
-        @Nonnull
-        public Text terminatePartial() throws HiveException {
-            try {
-                return BloomFilterUtils.serialize(filter, new Text());
-            } catch (IOException e) {
-                throw new HiveException(e);
-            }
-        }
-
-        public boolean merge(@Nonnull Text partial) throws HiveException {
-            final DynamicBloomFilter other;
-            try {
-                other = BloomFilterUtils.deserialize(partial, new DynamicBloomFilter());
-            } catch (IOException e) {
-                throw new HiveException(e);
-            }
-
-            if (filter == null) {
-                this.filter = other;
-            } else {
-                filter.or(other);
-            }
-            return true;
-        }
-
-        @Nullable
-        public Text terminate() throws HiveException {
-            if (filter == null) {
-                return null;
-            }
-
-            try {
-                return BloomFilterUtils.serialize(filter, new Text());
-            } catch (IOException e) {
-                throw new HiveException(e);
-            }
-        }
-
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/smile/classification/DecisionTree.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/smile/classification/DecisionTree.java b/core/src/main/java/hivemall/smile/classification/DecisionTree.java
index cc92ae8..a80a299 100644
--- a/core/src/main/java/hivemall/smile/classification/DecisionTree.java
+++ b/core/src/main/java/hivemall/smile/classification/DecisionTree.java
@@ -19,6 +19,7 @@ package hivemall.smile.classification;
 
 import static hivemall.smile.utils.SmileExtUtils.resolveFeatureName;
 import static hivemall.smile.utils.SmileExtUtils.resolveName;
+
 import hivemall.annotations.VisibleForTesting;
 import hivemall.math.matrix.Matrix;
 import hivemall.math.matrix.ints.ColumnMajorIntMatrix;
@@ -36,6 +37,8 @@ import hivemall.utils.lang.ObjectUtils;
 import hivemall.utils.lang.StringUtils;
 import hivemall.utils.lang.mutable.MutableInt;
 import hivemall.utils.sampling.IntReservoirSampler;
+import smile.classification.Classifier;
+import smile.math.Math;
 
 import java.io.Externalizable;
 import java.io.IOException;
@@ -53,9 +56,6 @@ import org.apache.hadoop.hive.ql.metadata.HiveException;
 import org.roaringbitmap.IntConsumer;
 import org.roaringbitmap.RoaringBitmap;
 
-import smile.classification.Classifier;
-import smile.math.Math;
-
 /**
  * Decision tree for classification. A decision tree can be learned by splitting the training set
  * into subsets based on an attribute value test. This process is repeated on each derived subset in

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/smile/regression/RegressionTree.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/smile/regression/RegressionTree.java b/core/src/main/java/hivemall/smile/regression/RegressionTree.java
index b8a3cc7..61964ae 100755
--- a/core/src/main/java/hivemall/smile/regression/RegressionTree.java
+++ b/core/src/main/java/hivemall/smile/regression/RegressionTree.java
@@ -18,6 +18,7 @@
 package hivemall.smile.regression;
 
 import static hivemall.smile.utils.SmileExtUtils.resolveFeatureName;
+
 import hivemall.annotations.VisibleForTesting;
 import hivemall.math.matrix.Matrix;
 import hivemall.math.matrix.ints.ColumnMajorIntMatrix;
@@ -36,6 +37,10 @@ import hivemall.utils.lang.ObjectUtils;
 import hivemall.utils.lang.StringUtils;
 import hivemall.utils.lang.mutable.MutableInt;
 import hivemall.utils.math.MathUtils;
+import smile.math.Math;
+import smile.regression.GradientTreeBoost;
+import smile.regression.RandomForest;
+import smile.regression.Regression;
 
 import java.io.Externalizable;
 import java.io.IOException;
@@ -51,11 +56,6 @@ import javax.annotation.Nullable;
 
 import org.apache.hadoop.hive.ql.metadata.HiveException;
 
-import smile.math.Math;
-import smile.regression.GradientTreeBoost;
-import smile.regression.RandomForest;
-import smile.regression.Regression;
-
 /**
  * Decision tree for regression. A decision tree can be learned by splitting the training set into
  * subsets based on an attribute value test. This process is repeated on each derived subset in a

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/smile/tools/TreePredictUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/smile/tools/TreePredictUDF.java b/core/src/main/java/hivemall/smile/tools/TreePredictUDF.java
index 9b775bf..511944c 100644
--- a/core/src/main/java/hivemall/smile/tools/TreePredictUDF.java
+++ b/core/src/main/java/hivemall/smile/tools/TreePredictUDF.java
@@ -158,7 +158,7 @@ public final class TreePredictUDF extends UDFWithOptions {
 
         Object arg2 = arguments[2].get();
         if (arg2 == null) {
-            throw new HiveException("array<double> features was null");
+            throw new HiveException("features was null");
         }
         this.featuresProbe = parseFeatures(arg2, featuresProbe);
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/statistics/MovingAverageUDTF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/statistics/MovingAverageUDTF.java b/core/src/main/java/hivemall/statistics/MovingAverageUDTF.java
deleted file mode 100644
index 112c47f..0000000
--- a/core/src/main/java/hivemall/statistics/MovingAverageUDTF.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * 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 hivemall.statistics;
-
-import hivemall.utils.hadoop.HiveUtils;
-import hivemall.utils.stats.MovingAverage;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.hadoop.hive.ql.exec.Description;
-import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
-import org.apache.hadoop.hive.ql.metadata.HiveException;
-import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
-import org.apache.hadoop.hive.serde2.io.DoubleWritable;
-import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
-import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
-import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
-import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
-import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
-
-@Description(name = "moving_avg", value = "_FUNC_(NUMBER value, const int windowSize)"
-        + " - Returns moving average of a time series using a given window")
-public final class MovingAverageUDTF extends GenericUDTF {
-
-    private PrimitiveObjectInspector valueOI;
-
-    private MovingAverage movingAvg;
-
-    private Object[] forwardObjs;
-    private DoubleWritable result;
-
-    @Override
-    public StructObjectInspector initialize(ObjectInspector[] argOIs) throws UDFArgumentException {
-        if (argOIs.length != 2) {
-            throw new UDFArgumentException(
-                "Two argument is expected for moving_avg(NUMBER value, const int windowSize): "
-                        + argOIs.length);
-        }
-        this.valueOI = HiveUtils.asNumberOI(argOIs[0]);
-
-        int windowSize = HiveUtils.getConstInt(argOIs[1]);
-        this.movingAvg = new MovingAverage(windowSize);
-
-        this.result = new DoubleWritable();
-        this.forwardObjs = new Object[] {result};
-
-        List<String> fieldNames = Arrays.asList("avg");
-        List<ObjectInspector> fieldOIs = Arrays.<ObjectInspector>asList(
-            PrimitiveObjectInspectorFactory.writableDoubleObjectInspector);
-
-        return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
-    }
-
-    @Override
-    public void process(Object[] args) throws HiveException {
-        double x = HiveUtils.getDouble(args[0], valueOI);
-
-        double avg = movingAvg.add(x);
-        result.set(avg);
-
-        forward(forwardObjs);
-    }
-
-    @Override
-    public void close() throws HiveException {}
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/GenerateSeriesUDTF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/GenerateSeriesUDTF.java b/core/src/main/java/hivemall/tools/GenerateSeriesUDTF.java
index 2567ac7..ed9a7a2 100644
--- a/core/src/main/java/hivemall/tools/GenerateSeriesUDTF.java
+++ b/core/src/main/java/hivemall/tools/GenerateSeriesUDTF.java
@@ -21,6 +21,10 @@ package hivemall.tools;
 import hivemall.utils.hadoop.HiveUtils;
 
 import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 import org.apache.hadoop.hive.ql.exec.Description;
 import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
@@ -28,70 +32,176 @@ import org.apache.hadoop.hive.ql.metadata.HiveException;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
+import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils;
+import org.apache.hadoop.io.IntWritable;
+import org.apache.hadoop.io.LongWritable;
+import org.apache.hadoop.io.Writable;
 
+// @formatter:off
 @Description(name = "generate_series",
         value = "_FUNC_(const int|bigint start, const int|bigint end) - "
-                + "Generate a series of values, from start to end. A similar function to PostgreSQL's `generate_serics`. http://www.postgresql.org/docs/current/static/functions-srf.html",
-        extended = "select generate_series(1,9);\n\n" + "1\n" + "2\n" + "3\n" + "4\n" + "5\n"
-                + "6\n" + "7\n" + "8\n" + "9")
+                + "Generate a series of values, from start to end. " + 
+                "A similar function to PostgreSQL's [generate_serics](http://www.postgresql.org/docs/current/static/functions-srf.html)",
+        extended = "SELECT generate_series(2,4);\n" + 
+                "\n" + 
+                " 2\n" + 
+                " 3\n" + 
+                " 4\n" + 
+                "\n" + 
+                "SELECT generate_series(5,1,-2);\n" + 
+                "\n" + 
+                " 5\n" + 
+                " 3\n" + 
+                " 1\n" + 
+                "\n" + 
+                "SELECT generate_series(4,3);\n" + 
+                "\n" + 
+                " (no return)\n" + 
+                "\n" + 
+                "SELECT date_add(current_date(),value),value from (SELECT generate_series(1,3)) t;\n" + 
+                "\n" + 
+                " 2018-04-21      1\n" + 
+                " 2018-04-22      2\n" + 
+                " 2018-04-23      3\n" + 
+                "\n" + 
+                "WITH input as (\n" + 
+                " SELECT 1 as c1, 10 as c2, 3 as step\n" + 
+                " UNION ALL\n" + 
+                " SELECT 10, 2, -3\n" + 
+                ")\n" + 
+                "SELECT generate_series(c1, c2, step) as series\n" + 
+                "FROM input;\n" + 
+                "\n" + 
+                " 1\n" + 
+                " 4\n" + 
+                " 7\n" + 
+                " 10\n" + 
+                " 10\n" + 
+                " 7\n" + 
+                " 4")
+// @formatter:on
 public final class GenerateSeriesUDTF extends GenericUDTF {
 
-    private long start, end;
-    private boolean useBigInt;
+    private PrimitiveObjectInspector startOI, endOI;
+    @Nullable
+    private PrimitiveObjectInspector stepOI;
+
+    @Nonnull
+    private final Writable[] row = new Writable[1];
+    private boolean returnLong;
 
     @Override
     public StructObjectInspector initialize(ObjectInspector[] argOIs) throws UDFArgumentException {
-        if (argOIs.length != 2) {
-            throw new UDFArgumentException("Expected number of arguments is 2: " + argOIs.length);
+        if (argOIs.length != 2 && argOIs.length != 3) {
+            throw new UDFArgumentException(
+                "Expected number of arguments is 2 or 3: " + argOIs.length);
+        }
+        if (!HiveUtils.isIntegerOI(argOIs[0])) {
+            throw new UDFArgumentException(
+                "Expected Integer type for the first argument: " + argOIs[0].getTypeName());
+        }
+        if (!HiveUtils.isIntegerOI(argOIs[1])) {
+            throw new UDFArgumentException(
+                "Expected Integer type for the second argument: " + argOIs[1].getTypeName());
         }
+        this.startOI = HiveUtils.asIntegerOI(argOIs[0]);
+        this.endOI = HiveUtils.asIntegerOI(argOIs[1]);
 
-        ArrayList<String> fieldNames = new ArrayList<String>(1);
+        if (argOIs.length == 3) {
+            if (!HiveUtils.isIntegerOI(argOIs[2])) {
+                throw new UDFArgumentException(
+                    "Expected Integer type for the third argument: " + argOIs[2].getTypeName());
+            }
+            this.stepOI = HiveUtils.asIntegerOI(argOIs[2]);
+        }
+
+        this.returnLong = HiveUtils.isBigIntOI(startOI) || HiveUtils.isBigIntOI(endOI);
+
+        List<String> fieldNames = new ArrayList<>(1);
         fieldNames.add("value");
-        ArrayList<ObjectInspector> fieldOIs = new ArrayList<ObjectInspector>(1);
+        List<ObjectInspector> fieldOIs = new ArrayList<>(1);
+        if (returnLong) {
+            fieldOIs.add(PrimitiveObjectInspectorFactory.writableLongObjectInspector);
+        } else {
+            fieldOIs.add(PrimitiveObjectInspectorFactory.writableIntObjectInspector);
+        }
+        return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
+    }
 
-        this.useBigInt = HiveUtils.isBigIntOI(argOIs[1]);
-        if (useBigInt) {
-            fieldOIs.add(PrimitiveObjectInspectorFactory.javaLongObjectInspector);
+    @Override
+    public void process(Object[] args) throws HiveException {
+        if (returnLong) {
+            generateLongSeries(args);
         } else {
-            fieldOIs.add(PrimitiveObjectInspectorFactory.javaIntObjectInspector);
+            generateIntSeries(args);
         }
+    }
 
-        this.start = HiveUtils.getAsConstLong(argOIs[0]);
-        this.end = HiveUtils.getAsConstLong(argOIs[1]);
-        if (start > end) {
-            throw new UDFArgumentException(
-                "start '" + start + "' must be less than or equals to end '" + end + "'");
+    private void generateLongSeries(@Nonnull final Object[] args) throws HiveException {
+        final long start, end;
+        long step = 1L;
+        switch (args.length) {
+            case 3:
+                step = PrimitiveObjectInspectorUtils.getLong(args[2], stepOI);
+                if (step == 0) {
+                    throw new UDFArgumentException("Step MUST NOT be zero");
+                }
+                // fall through
+            case 2:
+                start = PrimitiveObjectInspectorUtils.getLong(args[0], startOI);
+                end = PrimitiveObjectInspectorUtils.getLong(args[1], endOI);
+                break;
+            default:
+                throw new UDFArgumentException("Expected number of arguments: " + args.length);
         }
 
-        return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
+        final LongWritable row0 = new LongWritable();
+        row[0] = row0;
+        if (step > 0) {
+            for (long i = start; i <= end; i += step) {
+                row0.set(i);
+                forward(row);
+            }
+        } else {
+            for (long i = start; i >= end; i += step) {
+                row0.set(i);
+                forward(row);
+            }
+        }
     }
 
-    @Override
-    public void process(Object[] argOIs) throws HiveException {
-        final Object[] forwardObjs = new Object[1];
-        if (useBigInt) {
-            if (start == end) {
-                forwardObjs[0] = start;
-                forward(forwardObjs);
-            } else {
-                for (long i = start; i <= end; i++) {
-                    forwardObjs[0] = i;
-                    forward(forwardObjs);
+    private void generateIntSeries(@Nonnull final Object[] args) throws HiveException {
+        final int start, end;
+        int step = 1;
+        switch (args.length) {
+            case 3:
+                step = PrimitiveObjectInspectorUtils.getInt(args[2], stepOI);
+                if (step == 0) {
+                    throw new UDFArgumentException("Step MUST NOT be zero");
                 }
+                // fall through
+            case 2:
+                start = PrimitiveObjectInspectorUtils.getInt(args[0], startOI);
+                end = PrimitiveObjectInspectorUtils.getInt(args[1], endOI);
+                break;
+            default:
+                throw new UDFArgumentException("Expected number of arguments: " + args.length);
+        }
+
+        final IntWritable row0 = new IntWritable();
+        row[0] = row0;
+        if (step > 0) {
+            for (int i = start; i <= end; i += step) {
+                row0.set(i);
+                forward(row);
             }
         } else {
-            int starti = (int) start;
-            int endi = (int) end;
-            if (starti == endi) {
-                forwardObjs[0] = starti;
-                forward(forwardObjs);
-            } else {
-                for (int i = starti; i <= endi; i++) {
-                    forwardObjs[0] = i;
-                    forward(forwardObjs);
-                }
+            for (int i = start; i >= end; i += step) {
+                row0.set(i);
+                forward(row);
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/TryCastUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/TryCastUDF.java b/core/src/main/java/hivemall/tools/TryCastUDF.java
index a0f3257..adb8328 100644
--- a/core/src/main/java/hivemall/tools/TryCastUDF.java
+++ b/core/src/main/java/hivemall/tools/TryCastUDF.java
@@ -35,8 +35,8 @@ import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
 @Description(name = "try_cast",
         value = "_FUNC_(ANY src, const string typeName)"
                 + " - Explicitly cast a value as a type. Returns null if cast fails.",
-        extended = "Usage: select try_cast(array(1.0,2.0,3.0), 'array<string>')\n"
-                + "     select try_cast(map('A',10,'B',20,'C',30), 'map<string,double>')")
+        extended = "SELECT try_cast(array(1.0,2.0,3.0), 'array<string>')\n"
+                + "SELECT try_cast(map('A',10,'B',20,'C',30), 'map<string,double>')")
 @UDFType(deterministic = true, stateful = false)
 public final class TryCastUDF extends GenericUDF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/array/ArrayAppendUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/array/ArrayAppendUDF.java b/core/src/main/java/hivemall/tools/array/ArrayAppendUDF.java
index 25d0f4c..b3768bb 100644
--- a/core/src/main/java/hivemall/tools/array/ArrayAppendUDF.java
+++ b/core/src/main/java/hivemall/tools/array/ArrayAppendUDF.java
@@ -21,6 +21,7 @@ package hivemall.tools.array;
 import hivemall.utils.hadoop.HiveUtils;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 import javax.annotation.Nonnull;
@@ -38,7 +39,9 @@ import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
 import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
 
 @Description(name = "array_append",
-        value = "_FUNC_(array<T> arr, T elem) - Append an element to the end of an array")
+        value = "_FUNC_(array<T> arr, T elem) - Append an element to the end of an array",
+        extended = "SELECT array_append(array(1,2),3);\n 1,2,3\n\n"
+                + "SELECT array_append(array('a','b'),'c');\n \"a\",\"b\",\"c\"")
 @UDFType(deterministic = true, stateful = false)
 public final class ArrayAppendUDF extends GenericUDF {
 
@@ -71,6 +74,12 @@ public final class ArrayAppendUDF extends GenericUDF {
 
         Object arg0 = args[0].get();
         if (arg0 == null) {
+            Object arg1 = args[1].get();
+            if (arg1 != null) {
+                Object toAppend = returnWritables ? primInspector.getPrimitiveWritableObject(arg1)
+                        : primInspector.getPrimitiveJavaObject(arg1);
+                return Arrays.asList(toAppend);
+            }
             return null;
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/array/ArrayConcatUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/array/ArrayConcatUDF.java b/core/src/main/java/hivemall/tools/array/ArrayConcatUDF.java
index 62e3e36..7781564 100644
--- a/core/src/main/java/hivemall/tools/array/ArrayConcatUDF.java
+++ b/core/src/main/java/hivemall/tools/array/ArrayConcatUDF.java
@@ -38,7 +38,7 @@ import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils.Object
 
 @Description(name = "array_concat",
         value = "_FUNC_(array<ANY> x1, array<ANY> x2, ..) - Returns a concatenated array",
-        extended = "select array_concat(array(1),array(2,3));\n" + "> [1,2,3]")
+        extended = "SELECT array_concat(array(1),array(2,3));\n" + " [1,2,3]")
 @UDFType(deterministic = true, stateful = false)
 public class ArrayConcatUDF extends GenericUDF {
     /**
@@ -95,11 +95,11 @@ public class ArrayConcatUDF extends GenericUDF {
                 continue;
             }
 
-            final ListObjectInspector arrayOI = (ListObjectInspector) argumentOIs[i];
+            final ListObjectInspector arrayOI = argumentOIs[i];
+            final ObjectInspector elemOI = arrayOI.getListElementObjectInspector();
             final int arraylength = arrayOI.getListLength(arrayObject);
             for (int j = 0; j < arraylength; j++) {
                 Object rawObj = arrayOI.getListElement(arrayObject, j);
-                ObjectInspector elemOI = arrayOI.getListElementObjectInspector();
                 Object obj = ObjectInspectorUtils.copyToStandardObject(rawObj, elemOI,
                     ObjectInspectorCopyOption.WRITABLE);
                 ret.add(obj);

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/array/ArrayElementAtUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/array/ArrayElementAtUDF.java b/core/src/main/java/hivemall/tools/array/ArrayElementAtUDF.java
index 631d92d..21be8d4 100644
--- a/core/src/main/java/hivemall/tools/array/ArrayElementAtUDF.java
+++ b/core/src/main/java/hivemall/tools/array/ArrayElementAtUDF.java
@@ -30,7 +30,9 @@ import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.primitive.IntObjectInspector;
 
 @Description(name = "element_at",
-        value = "_FUNC_(array<T> list, int pos) - Returns an element at the given position")
+        value = "_FUNC_(array<T> list, int pos) - Returns an element at the given position",
+        extended = "SELECT element_at(array(1,2,3,4),0);\n 1\n\n"
+                + "SELECT element_at(array(1,2,3,4),-2);\n 3")
 @UDFType(deterministic = true, stateful = false)
 public final class ArrayElementAtUDF extends GenericUDF {
     private ListObjectInspector listInspector;

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/array/ArrayFlattenUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/array/ArrayFlattenUDF.java b/core/src/main/java/hivemall/tools/array/ArrayFlattenUDF.java
index 906d594..39d0110 100644
--- a/core/src/main/java/hivemall/tools/array/ArrayFlattenUDF.java
+++ b/core/src/main/java/hivemall/tools/array/ArrayFlattenUDF.java
@@ -19,6 +19,7 @@
 package hivemall.tools.array;
 
 import hivemall.utils.hadoop.HiveUtils;
+import hivemall.utils.lang.StringUtils;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -33,16 +34,16 @@ import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector.Category;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
 import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils.ObjectInspectorCopyOption;
 
 @Description(name = "array_flatten",
-        value = "_FUNC_(array<array<ANY>>) - Returns an array with the elements flattened.")
+        value = "_FUNC_(array<array<ANY>>) - Returns an array with the elements flattened.",
+        extended = "SELECT array_flatten(array(array(1,2,3),array(4,5),array(6,7,8)));\n"
+                + " [1,2,3,4,5,6,7,8]")
 @UDFType(deterministic = true, stateful = false)
 public final class ArrayFlattenUDF extends GenericUDF {
 
     private ListObjectInspector listOI;
-    private ListObjectInspector nextedListOI;
-    private ObjectInspector elemOI;
-
     private final List<Object> result = new ArrayList<>();
 
     @Override
@@ -58,11 +59,13 @@ public final class ArrayFlattenUDF extends GenericUDF {
             throw new UDFArgumentException(
                 "array_flatten takes array of array for the argument: " + listOI.toString());
         }
-        this.nextedListOI = HiveUtils.asListOI(listElemOI);
-        this.elemOI = nextedListOI.getListElementObjectInspector();
+
+        ListObjectInspector nestedListOI = HiveUtils.asListOI(listElemOI);
+        ObjectInspector elemOI = nestedListOI.getListElementObjectInspector();
 
         return ObjectInspectorFactory.getStandardListObjectInspector(
-            ObjectInspectorUtils.getStandardObjectInspector(elemOI));
+            ObjectInspectorUtils.getStandardObjectInspector(elemOI,
+                ObjectInspectorCopyOption.WRITABLE));
     }
 
     @Override
@@ -81,12 +84,17 @@ public final class ArrayFlattenUDF extends GenericUDF {
                 continue;
             }
 
-            final int subarrayLength = nextedListOI.getListLength(subarray);
+            final ListObjectInspector subarrayOI =
+                    HiveUtils.asListOI(listOI.getListElementObjectInspector());
+            final ObjectInspector elemOI = subarrayOI.getListElementObjectInspector();
+            final int subarrayLength = subarrayOI.getListLength(subarray);
             for (int j = 0; j < subarrayLength; j++) {
-                Object elem = nextedListOI.getListElement(subarray, j);
-                if (elem == null) {
+                Object rawElem = subarrayOI.getListElement(subarray, j);
+                if (rawElem == null) {
                     continue;
                 }
+                Object elem = ObjectInspectorUtils.copyToStandardObject(rawElem, elemOI,
+                    ObjectInspectorCopyOption.WRITABLE);
                 result.add(elem);
             }
         }
@@ -96,16 +104,7 @@ public final class ArrayFlattenUDF extends GenericUDF {
 
     @Override
     public String getDisplayString(String[] args) {
-        final StringBuffer buf = new StringBuffer();
-        buf.append("array_flatten(");
-        for (int i = 0, len = args.length; i < len; i++) {
-            if (i != 0) {
-                buf.append(", ");
-            }
-            buf.append(args[i]);
-        }
-        buf.append(")");
-        return buf.toString();
+        return "array_flatten(" + StringUtils.join(args, ',') + ")";
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/array/ArrayIntersectUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/array/ArrayIntersectUDF.java b/core/src/main/java/hivemall/tools/array/ArrayIntersectUDF.java
index 909176a..4b7f91c 100644
--- a/core/src/main/java/hivemall/tools/array/ArrayIntersectUDF.java
+++ b/core/src/main/java/hivemall/tools/array/ArrayIntersectUDF.java
@@ -41,7 +41,7 @@ import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
 
 @Description(name = "array_intersect",
         value = "_FUNC_(array<ANY> x1, array<ANY> x2, ..) - Returns an intersect of given arrays",
-        extended = "select array_intersect(array(1,3,4),array(2,3,4),array(3,5));\n" + "> [3]")
+        extended = "SELECT array_intersect(array(1,3,4),array(2,3,4),array(3,5));\n" + " [3]")
 @UDFType(deterministic = true, stateful = false)
 public final class ArrayIntersectUDF extends GenericUDF {
 
@@ -88,7 +88,7 @@ public final class ArrayIntersectUDF extends GenericUDF {
             return Collections.emptyList();
         }
 
-        Set<InspectableObject> checkSet = new HashSet<ArrayIntersectUDF.InspectableObject>();
+        Set<InspectableObject> checkSet = new HashSet<InspectableObject>();
         final ListObjectInspector arg0ListOI = argListOIs[0];
         final ObjectInspector arg0ElemOI = arg0ListOI.getListElementObjectInspector();
         final int arg0size = arg0ListOI.getListLength(arg0);
@@ -106,8 +106,7 @@ public final class ArrayIntersectUDF extends GenericUDF {
             if (argI == null) {
                 continue;
             }
-            final Set<InspectableObject> newSet =
-                    new HashSet<ArrayIntersectUDF.InspectableObject>();
+            final Set<InspectableObject> newSet = new HashSet<InspectableObject>();
             final ListObjectInspector argIListOI = argListOIs[i];
             final ObjectInspector argIElemOI = argIListOI.getListElementObjectInspector();
             for (int j = 0, j_size = argIListOI.getListLength(argI); j < j_size; j++) {

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/array/ArrayRemoveUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/array/ArrayRemoveUDF.java b/core/src/main/java/hivemall/tools/array/ArrayRemoveUDF.java
index 523093b..207c398 100644
--- a/core/src/main/java/hivemall/tools/array/ArrayRemoveUDF.java
+++ b/core/src/main/java/hivemall/tools/array/ArrayRemoveUDF.java
@@ -29,8 +29,8 @@ import org.apache.hadoop.io.Text;
 @Description(name = "array_remove",
         value = "_FUNC_(array<int|text> original, int|text|array<int> target)"
                 + " - Returns an array that the target is removed " + "from the original array",
-        extended = "select array_remove(array(1,null,3),array(null));\n" + "> [3]\n" + "\n"
-                + "select array_remove(array(\"aaa\",\"bbb\"),\"bbb\");\n" + "> [\"aaa\"]")
+        extended = "SELECT array_remove(array(1,null,3),array(null));\n" + " [3]\n" + "\n"
+                + "SELECT array_remove(array(\"aaa\",\"bbb\"),\"bbb\");\n" + " [\"aaa\"]")
 @UDFType(deterministic = true, stateful = false)
 public class ArrayRemoveUDF extends UDF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/array/ArraySliceUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/array/ArraySliceUDF.java b/core/src/main/java/hivemall/tools/array/ArraySliceUDF.java
index 2bc98b9..e842df6 100644
--- a/core/src/main/java/hivemall/tools/array/ArraySliceUDF.java
+++ b/core/src/main/java/hivemall/tools/array/ArraySliceUDF.java
@@ -39,9 +39,48 @@ import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
 import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
 import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorUtils;
 
+// @formatter:off
 @Description(name = "array_slice",
         value = "_FUNC_(array<ANY> values, int offset [, int length]) - Slices the given array by the given offset and length parameters.",
-        extended = "select array_slice(array(1,2,3,4,5,6), 2,4);\n" + "> [3,4]")
+        extended = "SELECT \n" + 
+                "  array_slice(array(1,2,3,4,5,6), 2,4),\n" + 
+                "  array_slice(\n" + 
+                "   array(\"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\", \"ten\"),\n" + 
+                "   0, -- offset\n" + 
+                "   2 -- length\n" + 
+                "  ),\n" + 
+                "  array_slice(\n" + 
+                "   array(\"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\", \"ten\"),\n" + 
+                "   6, -- offset\n" + 
+                "   3 -- length\n" + 
+                "  ),\n" + 
+                "  array_slice(\n" + 
+                "   array(\"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\", \"ten\"),\n" + 
+                "   6, -- offset\n" + 
+                "   10 -- length\n" + 
+                "  ),\n" + 
+                "  array_slice(\n" + 
+                "   array(\"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\", \"ten\"),\n" + 
+                "   6 -- offset\n" + 
+                "  ),\n" + 
+                "  array_slice(\n" + 
+                "   array(\"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\", \"ten\"),\n" + 
+                "   -3 -- offset\n" + 
+                "  ),\n" + 
+                "  array_slice(\n" + 
+                "   array(\"zero\", \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\", \"ten\"),\n" + 
+                "   -3, -- offset\n" + 
+                "   2 -- length\n" + 
+                "  );\n" + 
+                "\n" + 
+                " [3,4]\n" + 
+                " [\"zero\",\"one\"] \n" + 
+                " [\"six\",\"seven\",\"eight\"]\n" + 
+                " [\"six\",\"seven\",\"eight\",\"nine\",\"ten\"]\n" + 
+                " [\"six\",\"seven\",\"eight\",\"nine\",\"ten\"]\n" + 
+                " [\"eight\",\"nine\",\"ten\"]\n" + 
+                " [\"eight\",\"nine\"]")
+// @formatter:on
 @UDFType(deterministic = true, stateful = false)
 public final class ArraySliceUDF extends GenericUDF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/array/ArrayToStrUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/array/ArrayToStrUDF.java b/core/src/main/java/hivemall/tools/array/ArrayToStrUDF.java
new file mode 100644
index 0000000..185abc7
--- /dev/null
+++ b/core/src/main/java/hivemall/tools/array/ArrayToStrUDF.java
@@ -0,0 +1,96 @@
+/*
+ * 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 hivemall.tools.array;
+
+import hivemall.utils.hadoop.HiveUtils;
+
+import javax.annotation.Nullable;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.hadoop.hive.ql.exec.Description;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
+import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
+import org.apache.hadoop.hive.ql.metadata.HiveException;
+import org.apache.hadoop.hive.ql.udf.UDFType;
+import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
+import org.apache.hadoop.hive.serde2.objectinspector.ListObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
+import org.apache.hadoop.hive.serde2.objectinspector.primitive.StringObjectInspector;
+
+@Description(name = "array_to_str",
+        value = "_FUNC_(array arr [, string sep=',']) - Convert array to string using a sperator",
+        extended = "SELECT array_to_str(array(1,2,3),'-');\n" + "1-2-3")
+@UDFType(deterministic = true, stateful = false)
+public final class ArrayToStrUDF extends GenericUDF {
+
+    private ListObjectInspector listOI;
+    @Nullable
+    private StringObjectInspector sepOI;
+
+    @Override
+    public ObjectInspector initialize(ObjectInspector[] argOIs) throws UDFArgumentException {
+        if (argOIs.length != 1 && argOIs.length != 2) {
+            throw new UDFArgumentLengthException(
+                "array_to_str(array, string sep) expects one or two arguments: " + argOIs.length);
+        }
+
+        this.listOI = HiveUtils.asListOI(argOIs[0]);
+        if (argOIs.length == 2) {
+            this.sepOI = HiveUtils.asStringOI(argOIs[1]);
+        }
+
+        return PrimitiveObjectInspectorFactory.javaStringObjectInspector;
+    }
+
+    @Override
+    public String evaluate(DeferredObject[] arguments) throws HiveException {
+        Object arg0 = arguments[0].get();
+        if (arg0 == null) {
+            return null;
+        }
+
+        String sep = ",";
+        if (arguments.length == 2) {
+            Object arg1 = arguments[1].get();
+            if (arg1 != null) {
+                sep = sepOI.getPrimitiveJavaObject(arg1);
+            }
+        }
+
+        final StringBuilder buf = new StringBuilder();
+        final int len = listOI.getListLength(arg0);
+        for (int i = 0; i < len; i++) {
+            Object e = listOI.getListElement(arg0, i);
+            if (e != null) {
+                if (i != 0 && buf.length() > 0) {
+                    buf.append(sep);
+                }
+                buf.append(e.toString());
+            }
+        }
+        return buf.toString();
+    }
+
+    @Override
+    public String getDisplayString(String[] children) {
+        return "array_to_str(" + StringUtils.join(children, ',') + ")";
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/array/ArrayUnionUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/array/ArrayUnionUDF.java b/core/src/main/java/hivemall/tools/array/ArrayUnionUDF.java
index 921bbfa..91ae53f 100644
--- a/core/src/main/java/hivemall/tools/array/ArrayUnionUDF.java
+++ b/core/src/main/java/hivemall/tools/array/ArrayUnionUDF.java
@@ -46,7 +46,9 @@ import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils.Object
  * </pre>
  */
 @Description(name = "array_union",
-        value = "_FUNC_(array1, array2, ...) - Returns the union of a set of arrays")
+        value = "_FUNC_(array1, array2, ...) - Returns the union of a set of arrays",
+        extended = "SELECT array_union(array(1,2),array(1,2));\n" + "[1,2]\n\n"
+                + "SELECT array_union(array(1,2),array(2,3),array(2,5));\n" + "[1,2,3,5]")
 @UDFType(deterministic = true, stateful = false)
 public final class ArrayUnionUDF extends GenericUDF {
 
@@ -95,9 +97,9 @@ public final class ArrayUnionUDF extends GenericUDF {
 
             for (int j = 0, len = oi.getListLength(undeferred); j < len; ++j) {
                 Object nonStd = oi.getListElement(undeferred, j);
-                Object copied = ObjectInspectorUtils.copyToStandardObject(nonStd, elemOI,
+                Object copyed = ObjectInspectorUtils.copyToStandardObject(nonStd, elemOI,
                     ObjectInspectorCopyOption.WRITABLE);
-                objectSet.add(copied);
+                objectSet.add(copyed);
             }
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/array/ConditionalEmitUDTF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/array/ConditionalEmitUDTF.java b/core/src/main/java/hivemall/tools/array/ConditionalEmitUDTF.java
index a73a06f..89862b9 100644
--- a/core/src/main/java/hivemall/tools/array/ConditionalEmitUDTF.java
+++ b/core/src/main/java/hivemall/tools/array/ConditionalEmitUDTF.java
@@ -55,9 +55,26 @@ import org.apache.hadoop.hive.serde2.objectinspector.primitive.BooleanObjectInsp
  *    table_to_scan_once
  * </pre>
  */
+// @formatter:off
 @Description(name = "conditional_emit",
         value = "_FUNC_(array<boolean> conditions, array<primitive> features)"
-                + " - Emit features of a row according to various conditions")
+                + " - Emit features of a row according to various conditions",
+        extended = "WITH input as (\n" + 
+                "   select array(true, false, true) as conditions, array(\"one\", \"two\", \"three\") as features\n" + 
+                "   UNION ALL\n" + 
+                "   select array(true, true, false), array(\"four\", \"five\", \"six\")\n" + 
+                ")\n" + 
+                "SELECT\n" + 
+                "  conditional_emit(\n" + 
+                "     conditions, features\n" + 
+                "  )\n" + 
+                "FROM \n" + 
+                "  input;\n" +
+                " one\n" + 
+                " three\n" + 
+                " four\n" + 
+                " five")
+// @formatter:on
 @UDFType(deterministic = true, stateful = false)
 public final class ConditionalEmitUDTF extends GenericUDTF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/array/FirstElementUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/array/FirstElementUDF.java b/core/src/main/java/hivemall/tools/array/FirstElementUDF.java
index 957e724..a708529 100644
--- a/core/src/main/java/hivemall/tools/array/FirstElementUDF.java
+++ b/core/src/main/java/hivemall/tools/array/FirstElementUDF.java
@@ -31,7 +31,9 @@ import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
 /**
  * Return the first element in an array.
  */
-@Description(name = "first_element", value = "_FUNC_(x) - Returns the first element in an array ")
+@Description(name = "first_element", value = "_FUNC_(x) - Returns the first element in an array",
+        extended = "SELECT first_element(array('a','b','c'));\n a\n\n"
+                + "SELECT first_element(array());\n NULL")
 @UDFType(deterministic = true, stateful = false)
 public class FirstElementUDF extends GenericUDF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/array/LastElementUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/array/LastElementUDF.java b/core/src/main/java/hivemall/tools/array/LastElementUDF.java
index 91050b8..f36a6aa 100644
--- a/core/src/main/java/hivemall/tools/array/LastElementUDF.java
+++ b/core/src/main/java/hivemall/tools/array/LastElementUDF.java
@@ -31,7 +31,8 @@ import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
 /**
  * Return the last element in an array.
  */
-@Description(name = "last_element", value = "_FUNC_(x) - Return the last element in an array")
+@Description(name = "last_element", value = "_FUNC_(x) - Return the last element in an array",
+        extended = "SELECT last_element(array('a','b','c'));\n c")
 @UDFType(deterministic = true, stateful = false)
 public class LastElementUDF extends GenericUDF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/array/SortAndUniqArrayUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/array/SortAndUniqArrayUDF.java b/core/src/main/java/hivemall/tools/array/SortAndUniqArrayUDF.java
index e9c1cc5..d9f265e 100644
--- a/core/src/main/java/hivemall/tools/array/SortAndUniqArrayUDF.java
+++ b/core/src/main/java/hivemall/tools/array/SortAndUniqArrayUDF.java
@@ -31,7 +31,7 @@ import org.apache.hadoop.io.IntWritable;
 @Description(name = "sort_and_uniq_array",
         value = "_FUNC_(array<int>) - Takes array<int> and "
                 + "returns a sorted array with duplicate elements eliminated",
-        extended = "select sort_and_uniq_array(array(3,1,1,-2,10));\n" + "> [-2,1,3,10]")
+        extended = "SELECT sort_and_uniq_array(array(3,1,1,-2,10));\n" + " [-2,1,3,10]")
 @UDFType(deterministic = true, stateful = false)
 public class SortAndUniqArrayUDF extends UDF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/array/SubarrayEndWithUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/array/SubarrayEndWithUDF.java b/core/src/main/java/hivemall/tools/array/SubarrayEndWithUDF.java
index 9018117..36f23b5 100644
--- a/core/src/main/java/hivemall/tools/array/SubarrayEndWithUDF.java
+++ b/core/src/main/java/hivemall/tools/array/SubarrayEndWithUDF.java
@@ -29,7 +29,7 @@ import org.apache.hadoop.io.Text;
 @Description(name = "subarray_endwith",
         value = "_FUNC_(array<int|text> original, int|text key)"
                 + " - Returns an array that ends with the specified key",
-        extended = "select subarray_endwith(array(1,2,3,4), 3);\n" + "> [1,2,3]")
+        extended = "SELECT subarray_endwith(array(1,2,3,4), 3);\n" + " [1,2,3]")
 @UDFType(deterministic = true, stateful = false)
 public class SubarrayEndWithUDF extends UDF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/array/SubarrayStartWithUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/array/SubarrayStartWithUDF.java b/core/src/main/java/hivemall/tools/array/SubarrayStartWithUDF.java
index ae0d4fb..95ae6cf 100644
--- a/core/src/main/java/hivemall/tools/array/SubarrayStartWithUDF.java
+++ b/core/src/main/java/hivemall/tools/array/SubarrayStartWithUDF.java
@@ -29,7 +29,7 @@ import org.apache.hadoop.io.Text;
 @Description(name = "subarray_startwith",
         value = "_FUNC_(array<int|text> original, int|text key)"
                 + " - Returns an array that starts with the specified key",
-        extended = "select subarray_startwith(array(1,2,3,4), 2);\n" + "> [2,3,4]")
+        extended = "SELECT subarray_startwith(array(1,2,3,4), 2);\n" + " [2,3,4]")
 @UDFType(deterministic = true, stateful = false)
 public class SubarrayStartWithUDF extends UDF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/bits/BitsORUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/bits/BitsORUDF.java b/core/src/main/java/hivemall/tools/bits/BitsORUDF.java
index d5497b6..40f7b5c 100644
--- a/core/src/main/java/hivemall/tools/bits/BitsORUDF.java
+++ b/core/src/main/java/hivemall/tools/bits/BitsORUDF.java
@@ -38,8 +38,8 @@ import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectIn
 
 @Description(name = "bits_or",
         value = "_FUNC_(array<long> b1, array<long> b2, ..) - Returns a logical OR given bitsets",
-        extended = "select unbits(bits_or(to_bits(array(1,4)),to_bits(array(2,3))));\n"
-                + "> [1,2,3,4]")
+        extended = "SELECT unbits(bits_or(to_bits(array(1,4)),to_bits(array(2,3))));\n"
+                + " [1,2,3,4]")
 public final class BitsORUDF extends GenericUDF {
 
     private ListObjectInspector[] _listOIs;

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/bits/ToBitsUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/bits/ToBitsUDF.java b/core/src/main/java/hivemall/tools/bits/ToBitsUDF.java
index 599d90a..c33bd31 100644
--- a/core/src/main/java/hivemall/tools/bits/ToBitsUDF.java
+++ b/core/src/main/java/hivemall/tools/bits/ToBitsUDF.java
@@ -40,7 +40,7 @@ import org.apache.hadoop.io.LongWritable;
 
 @Description(name = "to_bits",
         value = "_FUNC_(int[] indexes) - Returns an bitset representation if the given indexes in long[]",
-        extended = "select to_bits(array(1,2,3,128));\n" + "> [14,-9223372036854775808]")
+        extended = "SELECT to_bits(array(1,2,3,128));\n" + " [14,-9223372036854775808]")
 @UDFType(deterministic = true, stateful = false)
 public final class ToBitsUDF extends GenericUDF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/bits/UnBitsUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/bits/UnBitsUDF.java b/core/src/main/java/hivemall/tools/bits/UnBitsUDF.java
index e3f6bae..0ec3762 100644
--- a/core/src/main/java/hivemall/tools/bits/UnBitsUDF.java
+++ b/core/src/main/java/hivemall/tools/bits/UnBitsUDF.java
@@ -40,7 +40,7 @@ import org.apache.hadoop.io.LongWritable;
 
 @Description(name = "unbits",
         value = "_FUNC_(long[] bitset) - Returns an long array of the give bitset representation",
-        extended = "select unbits(to_bits(array(1,4,2,3)));\n" + "> [1,2,3,4]")
+        extended = "SELECT unbits(to_bits(array(1,4,2,3)));\n" + " [1,2,3,4]")
 @UDFType(deterministic = true, stateful = false)
 public final class UnBitsUDF extends GenericUDF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/compress/DeflateUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/compress/DeflateUDF.java b/core/src/main/java/hivemall/tools/compress/DeflateUDF.java
index 4c82387..410ffd6 100644
--- a/core/src/main/java/hivemall/tools/compress/DeflateUDF.java
+++ b/core/src/main/java/hivemall/tools/compress/DeflateUDF.java
@@ -41,7 +41,7 @@ import org.apache.hadoop.io.Text;
 
 @Description(name = "deflate", value = "_FUNC_(TEXT data [, const int compressionLevel]) - "
         + "Returns a compressed BINARY object by using Deflater. The compression level must be in range [-1,9]",
-        extended = "select base91(deflate('aaaaaaaaaaaaaaaabbbbccc'));\n" + "> AA+=kaIM|WTt!+wbGAA")
+        extended = "SELECT base91(deflate('aaaaaaaaaaaaaaaabbbbccc'));\n" + " AA+=kaIM|WTt!+wbGAA")
 @UDFType(deterministic = true, stateful = false)
 public final class DeflateUDF extends GenericUDF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/compress/InflateUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/compress/InflateUDF.java b/core/src/main/java/hivemall/tools/compress/InflateUDF.java
index e2c4cc2..883d432 100644
--- a/core/src/main/java/hivemall/tools/compress/InflateUDF.java
+++ b/core/src/main/java/hivemall/tools/compress/InflateUDF.java
@@ -40,8 +40,8 @@ import org.apache.hadoop.io.Text;
 
 @Description(name = "inflate",
         value = "_FUNC_(BINARY compressedData) - Returns a decompressed STRING by using Inflater",
-        extended = "select inflate(unbase91(base91(deflate('aaaaaaaaaaaaaaaabbbbccc'))));\n"
-                + "> aaaaaaaaaaaaaaaabbbbccc")
+        extended = "SELECT inflate(unbase91(base91(deflate('aaaaaaaaaaaaaaaabbbbccc'))));\n"
+                + " aaaaaaaaaaaaaaaabbbbccc")
 @UDFType(deterministic = true, stateful = false)
 public final class InflateUDF extends GenericUDF {
 

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/datetime/SessionizeUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/datetime/SessionizeUDF.java b/core/src/main/java/hivemall/tools/datetime/SessionizeUDF.java
new file mode 100644
index 0000000..8235842
--- /dev/null
+++ b/core/src/main/java/hivemall/tools/datetime/SessionizeUDF.java
@@ -0,0 +1,99 @@
+/*
+ * 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 hivemall.tools.datetime;
+
+import java.util.UUID;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import org.apache.hadoop.hive.ql.exec.Description;
+import org.apache.hadoop.hive.ql.exec.UDF;
+import org.apache.hadoop.hive.ql.udf.UDFType;
+import org.apache.hadoop.io.LongWritable;
+import org.apache.hadoop.io.Text;
+
+//@formatter:off
+@Description(name = "sessionize",
+        value = "_FUNC_(long timeInSec, long thresholdInSec [, String subject])"
+                + "- Returns a UUID string of a session.",
+        extended = "SELECT \n" + 
+                "  sessionize(time, 3600, ip_addr) as session_id, \n" + 
+                "  time, ip_addr\n" + 
+                "FROM (\n" + 
+                "  SELECT time, ipaddr \n" + 
+                "  FROM weblog \n" + 
+                "  DISTRIBUTE BY ip_addr, time SORT BY ip_addr, time DESC\n" + 
+                ") t1")
+//@formatter:on
+@UDFType(deterministic = false, stateful = true)
+public final class SessionizeUDF extends UDF {
+
+    private long lastTime;
+    @Nullable
+    private Text lastSubject;
+    @Nonnull
+    private final Text sessionId = new Text();
+
+    @Nullable
+    public Text evaluate(@Nullable LongWritable time, @Nullable LongWritable threshold) {
+        if (time == null || threshold == null) {
+            return null;
+        }
+
+        final long thisTime = time.get();
+        final long diff = thisTime - lastTime;
+        if (diff < threshold.get()) {
+            this.lastTime = thisTime;
+            return sessionId;
+        }
+
+        sessionId.set(UUID.randomUUID().toString());
+        this.lastTime = time.get();
+        return sessionId;
+    }
+
+    @Nullable
+    public Text evaluate(@Nullable LongWritable time, @Nullable LongWritable threshold,
+            @Nullable Text subject) {
+        if (time == null || threshold == null || subject == null) {
+            return null;
+        }
+
+        if (subject.equals(lastSubject)) {
+            final long thisTime = time.get();
+            final long diff = thisTime - lastTime;
+            if (diff < threshold.get()) {
+                this.lastTime = thisTime;
+                return sessionId;
+            }
+        } else {
+            if (lastSubject == null) {
+                lastSubject = new Text(subject);
+            } else {
+                lastSubject.set(subject);
+            }
+        }
+
+        sessionId.set(UUID.randomUUID().toString());
+        this.lastTime = time.get();
+        return sessionId;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-hivemall/blob/49496032/core/src/main/java/hivemall/tools/json/FromJsonUDF.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/hivemall/tools/json/FromJsonUDF.java b/core/src/main/java/hivemall/tools/json/FromJsonUDF.java
index 36c29cc..97409dd 100644
--- a/core/src/main/java/hivemall/tools/json/FromJsonUDF.java
+++ b/core/src/main/java/hivemall/tools/json/FromJsonUDF.java
@@ -43,9 +43,47 @@ import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils;
 import org.apache.hadoop.io.Text;
 import org.apache.hive.hcatalog.data.HCatRecordObjectInspectorFactory;
 
+// @formatter:off
 @Description(name = "from_json",
         value = "_FUNC_(string jsonString, const string returnTypes [, const array<string>|const string columnNames])"
-                + " - Return Hive object.")
+                + " - Return Hive object.",
+        extended = "SELECT\n" + 
+                "  from_json(\n" + 
+                "    '{ \"person\" : { \"name\" : \"makoto\" , \"age\" : 37 } }',\n" + 
+                "    'struct<name:string,age:int>', \n" + 
+                "    array('person')\n" + 
+                "  ),\n" + 
+                "  from_json(\n" + 
+                "    '[0.1,1.1,2.2]',\n" + 
+                "    'array<double>'\n" + 
+                "  ),\n" + 
+                "  from_json(to_json(\n" + 
+                "    ARRAY(\n" + 
+                "      NAMED_STRUCT(\"country\", \"japan\", \"city\", \"tokyo\"), \n" + 
+                "      NAMED_STRUCT(\"country\", \"japan\", \"city\", \"osaka\")\n" + 
+                "    )\n" + 
+                "  ),'array<struct<country:string,city:string>>'),\n" + 
+                "  from_json(to_json(\n" + 
+                "    ARRAY(\n" + 
+                "      NAMED_STRUCT(\"country\", \"japan\", \"city\", \"tokyo\"), \n" + 
+                "      NAMED_STRUCT(\"country\", \"japan\", \"city\", \"osaka\")\n" + 
+                "    ),\n" + 
+                "    array('city')\n" + 
+                "  ), 'array<struct<country:string,city:string>>'),\n" + 
+                "  from_json(to_json(\n" + 
+                "    ARRAY(\n" + 
+                "      NAMED_STRUCT(\"country\", \"japan\", \"city\", \"tokyo\"), \n" + 
+                "      NAMED_STRUCT(\"country\", \"japan\", \"city\", \"osaka\")\n" + 
+                "    )\n" + 
+                "  ),'array<struct<city:string>>');\n"
+                + "```\n\n" +
+                "```\n" +
+                " {\"name\":\"makoto\",\"age\":37}\n" + 
+                " [0.1,1.1,2.2]\n" + 
+                " [{\"country\":\"japan\",\"city\":\"tokyo\"},{\"country\":\"japan\",\"city\":\"osaka\"}]\n" + 
+                " [{\"country\":\"japan\",\"city\":\"tokyo\"},{\"country\":\"japan\",\"city\":\"osaka\"}]\n" + 
+                " [{\"city\":\"tokyo\"},{\"city\":\"osaka\"}]")
+//@formatter:on
 @UDFType(deterministic = true, stateful = false)
 public final class FromJsonUDF extends GenericUDF {