用spark实现hive中的collect_set函数的功能

import org.apache.spark.SparkContext._
import org.apache.spark._

/**
 * Created by xiaojun on 2015/3/9.
 */
object SparkDemo2 {
  def main(args: Array[String]) {

    case class User(id: String, name: String, vtm: String, url: String)
    //val rowkey = (new RowKey).evaluate(_)
    val HADOOP_USER = "hdfs"
    // 设置访问spark使用的用户名
    System.setProperty("user.name", HADOOP_USER);
    // 设置访问hadoop使用的用户名
    System.setProperty("HADOOP_USER_NAME", HADOOP_USER);

    val conf = new SparkConf().setAppName("wordcount").setMaster("local").setExecutorEnv("HADOOP_USER_NAME", HADOOP_USER)
    val sc = new SparkContext(conf)
    val data = sc.textFile("test.txt")
    val rdd1 = data.map(line => {
      val r = line.split(",")
      User(r(0), r(1), r(2), r(3))
    })
    val rdd2 = rdd1.map(r => ((r.id, r.name), r))

    val seqOp = (a: List[String], b: User) => (b.vtm :: a).distinct
    val combOp = (a: List[String], b: List[String]) => {
      (a ::: b).distinct
    }

    println("-----------------------------------------")
    val rdd3 = rdd2.aggregateByKey(List[String]())(seqOp, combOp).mapValues(l => l.mkString(","))
    rdd3.collect.foreach(r => println(r._2))
    println("-----------------------------------------")
    sc.stop()
  }

}

test.txt文件内容(随便造的,没具体含义)如下:

id1,user1,2,http://www.hupu.com
id1,user1,2,http://www.hupu.com
id1,user1,3,http://www.hupu.com
id1,user1,100,http://www.hupu.com
id2,user2,2,http://www.hupu.com
id2,user2,1,http://www.hupu.com
id2,user2,50,http://www.hupu.com
id2,user2,2,http://touzhu.hupu.com
最终得出的结果为:

100,3,2
2,50,1

和collect_set效果一致.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: collect_set函数Hive的一个聚合函数,用于将指定列的所有不同值收集到一个集合。该函数返回一个集合,其包含指定列的所有不同值。如果指定列有重复值,则只会在集合出现一次。例如,如果我们有一个包含以下数据的表: id | name ---|----- 1 | Alice 2 | Bob 3 | Alice 4 | Charlie 我们可以使用collect_set函数来收集所有不同的名字: SELECT collect_set(name) FROM my_table; 这将返回一个包含三个元素的集合:{"Alice", "Bob", "Charlie"}。注意,集合的元素顺序是不确定的。 ### 回答2: Hivecollect_set函数是一种聚合函数,它用于将传入的所有值收集到一个集合并返回,集合的元素不重复。collect_set函数可以应用于Hive的一列数据,并且返回一个集合结果,是一种非常有用的函数collect_set的语法如下: collect_set(expr) 其,expr是要聚合的列或表达式。 在使用collect_set之前,需要先进行分组(group by),将同一分组内的数据用collect_set函数聚合成一个集合。例如: SELECT department, collect_set(employee_name) FROM employees GROUP BY department; 这个查询将数据按照department分组,并将每个部门内的员工名字收集到一个集合返回。 需要注意的是,collect_set函数返回的结果是无序的,因为集合的元素是不重复的。 另外,Hive还提供了一个与collect_set函数类似的函数collect_list,它也用于收集数据到一个集合,不同的是,collect_list函数返回的是一个列表结果,列表的元素可以重复。 在实际的业务场景collect_set函数非常实用。例如,在一个电商平台的订单数据,我们可以通过collect_set函数将每个订单的商品编号收集到一个集合,以便进行数据分析和挖掘。 总之,Hivecollect_set函数是一种非常有用的聚合函数,可以将分组数据收集到一个集合,并且集合的元素不重复。在实际的数据处理,它有着广泛的应用场景。 ### 回答3: 在Hivecollect_set函数是用于聚合数据的函数之一。它可以用来将一组数据的唯一值收集成一个集合,然后将集合作为一个新的列来输出。这个集合可以被表示为一个数组或一个字符串列表,具体取决于你将其与何种数据类型一起使用。 collect_set函数的语法如下: ``` collect_set(expression) ``` 该函数的参数是要收集的表达式,可以是一个列名或者表达式。 使用collect_set函数的一个例子是统计每个电影类型电影的平均评分。我们可以使用如下的代码: ``` SELECT type, AVG(rating) FROM movies GROUP BY type ``` 这个查询将返回每种电影类型的平均评分。但是,如果我们想知道每种类型有哪些电影,我们可以在查询加入collect_set函数: ``` SELECT type, AVG(rating), collect_set(title) FROM movies GROUP BY type ``` 这个查询将返回每种电影类型的平均评分和包含该类型的所有电影名称的集合。注意,我们在这里使用了title作为收集的表达式。这个查询将返回一个包含每种类型的所有电影名称的列表的集合。 使用collect_set函数时要注意以下几点: - collect_set函数只能用在group by子句。 - 这个函数会将表达式的重复值去除,只保留唯一值。 - collect_set函数返回的结果集是无序的,因为集合并不保留元素顺序。 - 由于collect_set函数用来聚合数据,因此它可以提高查询效率。 在Hive使用collect_set函数可以方便地将一组数据的唯一值收集起来,并且可以使用它来聚合数据和统计信息。无论你是在处理什么样的数据,都可以使用collect_set函数来方便地找到唯一值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值