多条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. opatch卸载weblogic12.1.3.0补丁

    1.首先进入opatch目录 2.查看opatch命令(心急于卸载的朋友直接跳过这步) [weblogic@localhost OPatch]$ ./opatch -help Oracle 中间补丁程 ...

  2. windows RDP远程代码执行_CVE-2019-0708漏洞复现

    windows RDP远程代码执行_CVE-2019-0708漏洞复现 一.漏洞概述 2019年5月14日微软官方发布安全补丁,修复了windows远程桌面服务的远程代码执行漏洞,该漏洞影响了某些旧版 ...

  3. go 学习笔记之初识 go 语言

    Go 是一种开源编程语言,可以轻松构建简单,可靠,高效的软件. 摘录自 github: https://github.com/golang/go,其中官网(国外): https://golang.or ...

  4. 个人永久性免费-Excel催化剂功能第77波-专业图表制作辅助之批量维护序列点颜色及数据标签

    2018年最后一天工作日完成第77波,7是代表完美,2个7,双重的完美,Excel催化剂的2018年从始至终共77波都充满着完美接近极致的功能体验.感谢各位一路相随,陪伴成长.最后一波,再次让数据分析 ...

  5. 机器学习之K均值聚类

      聚类的核心概念是相似度或距离,有很多相似度或距离的方法,比如欧式距离.马氏距离.相关系数.余弦定理.层次聚类和K均值聚类等 1. K均值聚类思想   K均值聚类的基本思想是,通过迭代的方法寻找K个 ...

  6. MySQL图形工具SQLyog破解版

    最近一直在用MySQL,所以分享一下现在这套开发工具. SQLyog:链接:http://pan.baidu.com/s/1bLq2OA 密码:h5bj 注册信息用户名:yunjian注册码:81f4 ...

  7. Linux设备驱动程序学习----2.内核模块与应用程序的对比

    内核模块与应用程序的对比 更多内容请参考Linux设备驱动程序学习----目录 1. 内核模块与应用程序的对比 内核模块和应用程序之间的不同之处: 大多数中小规模的应用程序是从头到尾执行单个任务,而模 ...

  8. spark 源码分析之十--Spark RPC剖析之TransportResponseHandler、TransportRequestHandler和TransportChannelHandler剖析

    spark 源码分析之十--Spark RPC剖析之TransportResponseHandler.TransportRequestHandler和TransportChannelHandler剖析 ...

  9. unity3d立方体碰撞检测(c#代码实现)

    由于unity自带的碰撞组件特别耗费性能,网上的unity物体碰撞的c#代码实现比较少,没有适合的,只能自己写一个来用: using System; using System.Collections. ...

  10. 我与微笑哥以及 Java 极客技术的前世今生

    ​关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料. Hello,大家好,我是子悠,Java 极客技术团队的作者之一,本周是六月的第三周,将由我给大家编辑 ...