hive的udtf函数一 (lateral view explode源码分析)
Lateral view与UDTF函数一起使用,UDTF对每个输入行产生0或者多个输出行。Lateral view首先在基表的每个输入行应用UDTF,然后连接结果输出行与输入行组成拥有指定表别名的虚拟表。
测试SQL:
explain select c1 as mlike from person_info
lateral view explode(likes)t1 as c1;
下图是上面SQL的hive执行任务:对每一步进行分析
由上面的任务我们可以发现两条线:
说明:
1、TableScanOperator
常规的读表操作
2、LateralViewForwardOperator
源码:
@Override
public void process(Object row, int tag) throws HiveException {
forward(row, inputObjInspectors[tag]);
}
几乎什么都没做,数据怎么来的,还怎么送出去。作用是提示一下开始准备操作了
2-1、左侧SelectOperator
筛选出你需要的列,这里是从虚拟表中获得的
2-2-1、右侧SelectOperator
筛选出likes的列,进行数组的解析
2-2-2、右侧UDTFOperator
源码解析
@Override
public void process(Object row, int tag) throws HiveException {
StructObjectInspector soi = (StructObjectInspector) inputObjInspectors[tag];
List<? extends StructField> fields = soi.getAllStructFieldRefs();
//从row里解出字段
for (int i = 0; i < fields