多条collect_list,然后将collect_list的结果concat起来,最初使用的是concat_ws(),但是发现超过4个collect_list就会报错,

select concat_ws("|",
collect_list(concat_ws(',',n_cgi_1,ltencrsrp_1)),
collect_list(concat_ws(',',n_cgi_2,ltencrsrp_2)),
collect_list(concat_ws(',',n_cgi_3,ltencrsrp_3)),
collect_list(concat_ws(',',n_cgi_4,ltencrsrp_4)),
collect_list(concat_ws(',',n_cgi_5,ltencrsrp_5)),
collect_list(concat_ws(',',n_cgi_6,ltencrsrp_6))) as result
from test group by id,name;

于是考虑自定义UDF函数。

collect_list函数在hive中返回值类型为array<T>,对应java的arrayList<T>,但是在写spark UDF时候报错:

Spark java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef cannot be cast to java.util.ArrayList

选择了一个不够牛逼但是很方便的方式,样例代码如下:

package com.kong.test.UDF;

import org.apache.spark.sql.api.java.UDF5;
import scala.collection.mutable.WrappedArray;

public class TestArray implements UDF5<WrappedArray<String>, WrappedArray<String>, WrappedArray<String>, WrappedArray<String>, WrappedArray<String>, String>  {
	private static final long serialVersionUID = 1L;

	//将array中的元素取出来,并以|隔开
	public String call(WrappedArray<String> t1, WrappedArray<String> t2, WrappedArray<String> t3,
			WrappedArray<String> t4, WrappedArray<String> t5) throws Exception {
		StringBuffer sb = new StringBuffer();

		for (int i = 0; i < t1.length(); i++) {
			String ele = t1.apply(i);
			System.out.println(ele);
			if(!"".equals(ele)){
				sb.append(ele).append("|");
			}
		}

		for (int i = 0; i < t2.length(); i++) {
			String ele = t2.apply(i);
			System.out.println(ele);
			if(!"".equals(ele)){
				sb.append(ele).append("|");
			}
		};
		for (int i = 0; i < t3.length(); i++) {
			String ele = t3.apply(i);
			System.out.println(ele);
			if(!"".equals(ele)){
				sb.append(ele).append("|");
			}
		};
		for (int i = 0; i < t4.length(); i++) {
			String ele = t4.apply(i);
			System.out.println(ele);
			if(!"".equals(ele)){
				sb.append(ele).append("|");
			}
		};
		for (int i = 0; i < t5.length(); i++) {
			String ele = t5.apply(i);
			System.out.println(ele);
			if(!"".equals(ele)){
				sb.append(ele).append("|");
			}
		};
		System.out.println(sb.toString());

		String res = sb.toString();
		String res1 = res.substring(0, res.length()-1);
		return res1;
	}

}

基于sparksql collect_list的udf定义踩坑的更多相关文章

  1. NET Core2.0 Memcached踩坑,基于EnyimMemcachedCore整理MemcachedHelper帮助类。

    DotNetCore2.0下使用memcached缓存. Memcached目前微软暂未支持,暂只支持Redis,由于项目历史原因,先用博客园开源项目EnyimMemcachedCore,后续用到的时 ...

  2. Asp.Net Core 2.0 项目实战(5)Memcached踩坑,基于EnyimMemcachedCore整理MemcachedHelper帮助类。

    Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了 Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架 Asp.Ne ...

  3. 基于JQuery可拖动列表格插件DataTables的踩坑记

    前言 最近项目中在使用能够拖动列调整列位置顺序的表格插件---DataTables,这也是目前我找到的唯一一种存在有这种功能的插件. 在查找使用方法的过程中发现可用案例并不多,且大多言语不详.本文将全 ...

  4. JavaScript 踩坑心得— 为了高速(下)

    一.前言 本文的上一篇 JavaScript 踩坑心得- 为了高速(上) 主要和大家分享的是 JavaScript 使用过程中的基本原则以及编写过程中的心得分享,本文主要和大家聊聊在各个使用场景下的 ...

  5. Spark踩坑记——从RDD看集群调度

    [TOC] 前言 在Spark的使用中,性能的调优配置过程中,查阅了很多资料,之前自己总结过两篇小博文Spark踩坑记--初试和Spark踩坑记--数据库(Hbase+Mysql),第一篇概况的归纳了 ...

  6. Spark 1.6升级2.x防踩坑指南

    原创文章,谢绝转载 Spark 2.x自2.0.0发布到目前的2.2.0已经有一年多的时间了,2.x宣称有诸多的性能改进,相信不少使用Spark的同学还停留在1.6.x或者更低的版本上,没有升级到2. ...

  7. 『审慎』.Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历

    异步Task简单介绍 本标题有点 哗众取宠,各位都别介意(不排除个人技术能力问题) —— 接下来:我将会用一个小Demo 把 本文思想阐述清楚. .Net 4.0 就有了 Task 函数 —— 异步编 ...

  8. rsyslog磁盘辅助(Disk-Assisted)模式踩坑记

    最近公司为方便tracing.排查, 搞全链路日志收集,而我手上的10亿+pv的动态前端服务必然在考虑之列. 之前呢. 都是运维定制的收集方式: 如上图,rsyslog push kafka, 优点嘛 ...

  9. lombok踩坑与思考

    虽然接触到lombok已经有很长时间,但是大量使用lombok以减少代码编写还是在新团队编写新代码维护老代码中遇到的. 我个人并不主张使用lombok,其带来的代价足以抵消其便利,但是由于团队编码风格 ...

随机推荐

  1. R语言矩阵

    矩阵是元素布置成二维矩形布局的R对象. 它们包含相同原子类型的元素. R创建矩阵的语法: matrix(data, nrow, ncol, byrow, dimnames) 参数说明: data - ...

  2. 下载历史版本CentOS

    搜索centos 进入主页面向下移动滚动找到 点击后向下移动,选择需要的版本进行tree 选择 OK!

  3. elasticsearch5.4集群超时

    四个节点,有两个是新增加的节点,两个老节点间组成集群没有问题,新增加了两个节点,无论是四个组成集群 # --------------------------------- Discovery ---- ...

  4. python面向对象编程小程序- 选课系统

    选课系统 花了一晚上写的,可能还存在不足 1.程序框架 2.文件夹建立 D:/选课系统 |___api | |___common_api.py |___bil | |___common.py |___ ...

  5. 踩坑 Spring Cloud Hystrix 线程池队列配置

    背景: 有一次在生产环境,突然出现了很多笔还款单被挂起,后来排查原因,发现是内部系统调用时出现了Hystrix调用异常.在开发过程中,因为核心线程数设置的比较大,没有出现这种异常.放到了测试环境,偶尔 ...

  6. Hadoop值Partition分区

    分区操作 为什么要分区? 要求将统计结果按照条件输出到不同文件中(分区).比如:将统计结果按 照手机归属地不同省份输出到不同文件中(分区) 默认 partition 分区 /** 源码中:numRed ...

  7. Redis持久化背后的故事

    Redis持久化 Redis提供了不同的持久化选项: RDB持久化以指定的时间间隔保存那个时间点的数据快照. AOF持久化方法则会记录每一个服务器收到的写操作.在服务器启动时,这些记录的操作会逐条执行 ...

  8. c的格式输出“%”

  9. 【杂谈】Hash表与平衡树

    hash表与平衡树查询数据的时间复杂度是多少? hash表为O(1),平衡树为O(logn) 这个时间复杂度是如何得出的? 时间复杂度是按照最糟糕的情况来的.但即使是最糟糕的情况,hash表也只需要计 ...

  10. 转 python - Python在终端通过pip安装好包以后,在Pycharm中依然无法使用的解决办法

    转 https://blog.csdn.net/kouyi5627/article/details/80531442 在终端通过pip装好包以后,在pycharm中导入包时,依然会报错.新手不知道具体 ...