Hive高频面试题之UDTF实现多行输出

题目说明

编写一个udf,输入这个数组之后按多列输出
在这里插入图片描述

题解

udtf其实是udf里面比较少自己去写的东西,所以反而是盲区,这种题目就是摸过的就觉得简单,所谓难者不会,会者不难
代码会放在最后,我说一下精髓部分!
凡是UDF编写,关键点是了解计算特征,udtf其实关键点就是输入一行,可以输出多行,不管里头怎么折腾,反正只要是Java代码写的,输入一行的话我们无非都是一个输入参数,输出多行要么是数组,要么是集合。

输入输出参数说明

输入部分,其实就是select 函数的时候给的那一排参数
比如select udf(1,2,3) 那么args(0)=1,args(1)=2,args(3)=3
题目给的是数组,数组在输入参数的时候我们当成复杂参数来对待,这里不能混淆
比如select udf([1,2,3],[4,5,6])的时候,对应的就是args(0)=[1,2,3],args(1)=[4,5,6]
题目中的是select udf([1,2,3])的形式
在这里插入图片描述
输出部分,正如我们说的,不是类型就是数组类型,udtf中输出的其实是一个数组的类型,有一个元素就
forward(array)会调用一次,在process里面调用多次的时候就是多个结果输出

初始化部分

初始化部分其实是给一个表头,也就是结果中的默认列,因为可以输出多行嘛,需要有列名,一个是列名,一个是列的类型:
在这里插入图片描述
对于结果的话:
在这里插入图片描述

源码

最后,附上代码源码

package org.apache.spark.udf;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import com.google.common.collect.Lists;
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.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.StructObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;

public class MultiplyRow extends GenericUDTF {
    @Override
    public void close() throws HiveException {
    }
    @Override
    public StructObjectInspector initialize(ObjectInspector[] args) throws UDFArgumentException {
        if (args.length != 1) {
            throw new UDFArgumentLengthException("ExplodeMap takes only one argument");
        }
        if (args[0].getCategory() != ObjectInspector.Category.LIST) {
            throw new UDFArgumentException("ExplodeMap takes array as a parameter");
        }
        ArrayList<String> fieldNames = new ArrayList<String>();
        ArrayList<ObjectInspector> fieldOIs = new ArrayList<ObjectInspector>();
        fieldNames.add("row");
        fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
        fieldNames.add("value");
        fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
        return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
    }
    @Override
    public void process(Object[] args) throws HiveException {
        List<String> ls= (ArrayList) args[0];
       for (int i = 0; i < ls.size(); i++) {
            try {
                String[] result=new String[2];
                result[0]="row"+String.valueOf(i);
                result[1]=ls.get(i);
                forward(result);
            } catch (Exception e) {
                continue;
            }
        }
    }
}

这部分是测试代码

package org.apache.spark;

import org.apache.spark.sql.SparkSession;

import java.io.File;

public class MultiplyRowTest {
    public static void main(String[] args) {
        String warehouseLocation = new File("spark-warehouse").getAbsolutePath();
        SparkSession spark = SparkSession
                .builder()
                .appName("MultiplyRowTest")
                .config("spark.sql.warehouse.dir", warehouseLocation)
                .master("local[*]")
                .enableHiveSupport()
                .getOrCreate();
       // spark.sql("CREATE TEMPORARY FUNCTION myudf as 'org.apache.spark.udf.UserDefinedUDTF'");
        spark.sql("create temporary function  udtf as 'org.apache.spark.udf.MultiplyRow'");
        spark.sql("select udtf(split('a,b,c',','))  ").show();
       // spark.sql("select 'a' as c1,  myudf('a,b,c') as array ").show();
    }
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一些常见的 Hive 面试题: 1. Hive中什么是元数据? 答:在Hive中,元数据是指描述表、分区和列的信息,包括表结构、数据类型、位置及其它有关表的信息。 2. Hive中的分区是什么? 答:Hive中的分区是将表数据按照指定的列值进行划分,从而提高查询效率。通常情况下,分区列是表中的时间列或者地理位置列。 3. Hive中的Bucket是什么? 答:Hive中的Bucket是将表数据划分成固定数量的文件,从而提高查询效率。Bucket可以通过HASH函数对表数据进行划分。 4. HiveUDF和UDAF有什么区别? 答:UDF(User Defined Function)是用户自定义函数,主要用于处理单行数据。UDAF(User Defined Aggregation Function)是用户自定义聚合函数,主要用于处理多行数据并返回一个结果。 5. Hive中的数据类型有哪些? 答:Hive中的数据类型包括:整型、浮点型、字符串型、日期型、数组型、Map型、Struct型等。 6. 如何在Hive中加载数据? 答:可以使用LOAD DATA语句将数据加载到Hive表中。例如: ``` LOAD DATA INPATH '/input/data' INTO TABLE table_name; ``` 7. 如何在Hive中创建表? 答:可以使用CREATE TABLE语句创建表。例如: ``` CREATE TABLE table_name ( column1_name data_type, column2_name data_type, ... ) PARTITIONED BY (partition_column_name data_type) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE; ``` 8. 如何在Hive中查询数据? 答:可以使用SELECT语句查询数据。例如: ``` SELECT column1_name, column2_name FROM table_name; ``` 9. Hive的执行流程是什么? 答:Hive的执行流程包括:解析HQL语句、生成逻辑计划、生成物理计划、执行物理计划、输出结果。 10. Hive的优点和缺点是什么? 答:Hive的优点包括:易于使用、支持SQL语法、扩展性好、适合大数据处理等。缺点包括:性能相对较差、不支持实时查询、不支持事务处理等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值