可以写UDAF,但导jar包啥的挺麻烦的,我找了个简单方法,两个函数搞定。

需求是这样的,统计出同一用户在同一地点会去哪些商店,商店以':'隔开。

(第一列用户id,第二列商店id,第三列地区id,第四列日期)

spark-sql> select * from test;
1027765	4822	172	20151028
1027765	4822	172	20151026
881482	4822	172	20151129
1027765	4822	172	20151007
1027765	4822	172	20151011
1027765	4822	172	20151010
1027765	4822	172	20151023
1027765	4822	172	20151022
1027765	820	172	20151030
1027765	820	172	20151023
1027765	820	172	20151114
1027765	820	172	20151127
881482	6709	172	20151121
881482	7830	172	20151121
881482	43	172	20151027
Time taken: 0.259 seconds, Fetched 15 row(s)
spark-sql> select uid, lid, concat_ws(':',collect_set(mid)) as mids from test group by uid,lid;
881482  172     4822:6709:7830:43                                               
1027765	172	4822:820
Time taken: 1.933 seconds, Fetched 2 row(s)
但要注意collect_set(mid)中的mid字段类型必须是string类型,不是的话改一下就可以了。 
alter table test change mid mid string;
将mid字段的字段名改为mid,字段类型改为string类型。 将上图中红框的两个数组合并为一个数组并去重,也就是同一个productid对应的city_tags和hotel_tags取并集 第一步,先将数组中的数据全部取出来 使用LATERAL VIEW、explode 2个函数,可以实现把一个array类型的值分开 SELECT t.productID, t.cityID,t.airlineCode,t.hotelID,tagv FROM (SELECT productID, cityID,airlineCode,hotelID, ta ##hive 双表合并生成新主键insert overwrite into dim_goods_d partition(dt='2018-06-01')selecttb.*,row_number() over(order by id) + ta.max_id as gidfrom tmp_s_inc as tbcross join(select coalesce(max(gid),0)) as m... 本文介绍如何通过spark sql对数据进各种的合并操作,包括:合并合并,相同key的合并等等。 在实际的数据处理场景中,数据的合并操作非常常用,这里介绍如何通过spark sql来完成常用的合并操作。 准备以下数据: name,address,age,id,time david,shenzhen,31,1,201903 eason,shenzhen,27,2,201904 jarry,wuhan,35,3,201904 aarry2,wuhan1,34,4 用到的函数及定义 concat_ws(sep, [str | array(str)]+) - Returns the concatenation of the strings separated by sep. Examples: SELECT concat_ws(’ ', ‘Spark’, ‘SQL’); Spark SQL collect_set(expr) - Collects and ... 按照指定字段的值做多合并 涉及到的功能函数concat_ws、collect_list(用于决定以哪种形式组织多个值) select id, concat_ws(',', collect_list(val)) as info from table_name group by id /* 效果如下 --------------------------------------- id |val --------------------------------------- select product_id, concat_ws('_',collect_set(promotion_id)) as promotion_ids from product_promotion group by product_id 执结果: 5112 9 1. 首先对于将多缩减一行的需求我们可以通过 flatMapValues字段实现该功能。 flatMapValues:同基本转换操作中的flatMap,只不过flatMapValues是针对[K,V]中的V值进flatMap操作。 这些天处理spark任务时,遇到的困惑,我们通常map或forea处理RDD或DF时,如何在RDD中每一行处理的过程中将一行的数据按照需求分裂成多?又如何将RDD中多(m)完全平的数据相同字段不变、不同字段合并成一段,从而形成n数据(n<<m)?1. 首先对于将多缩减一行的需求我们可以通过 flatMapValues字段实现该功能。flatMapValues:同基本转换操作中... 有这样需求,原始数据如下图。开发需要把start_city_id和end_city_id作为key, value是一个list集合,里面包含这些所有所有字段详细信息,存到redis。 |-- first_traffic_type: string (nullable = true) |-- first_traffic_code: string (nullable = true) |-- fi...