Apache spark 如何在Hadoop堆栈中聚合数据?

Apache spark 如何在Hadoop堆栈中聚合数据?,apache-spark,apache-spark-sql,aggregate,Apache Spark,Apache Spark Sql,Aggregate,我想通过一些任意的标准将数据聚合到“bucket”中(比如ElasticSearch,而不是Hive bucketing) 我认为,解释我想要实现的目标的最佳方式是在数据上展示,因此: 基本问题是: 步骤1 我有这样的结构中的数据(当前导入到HIVE ORC表): 现在我想按id对数据进行分组,按桶大小5进行分组,因此我实现了: 步骤2 bucket_no | id | category | subcategory | value 1 1 foo bar

我想通过一些任意的标准将数据聚合到“bucket”中(比如ElasticSearch,而不是Hive bucketing)

我认为,解释我想要实现的目标的最佳方式是在数据上展示,因此:

基本问题是:

步骤1

我有这样的结构中的数据(当前导入到HIVE ORC表):

现在我想按id对数据进行分组,按桶大小5进行分组,因此我实现了:

步骤2

bucket_no | id | category | subcategory | value
1           1    foo        bar           3
            3    foo        bar           5
            5    foo2       bar1          7
2           6    foo        bar2          1
            9    foo2       bar           5
3           11   foo        bar           10
所以我有3个水桶要处理。这让我想到

高级问题:

在步骤#2上(或可能在步骤#2之后),我想对存储桶执行一些操作,例如,查找每个类别的平均值:

步骤3

bucket_no | category  | AVG(value)
1           foo         4
            foo2        7
2           foo         1
            foo2        5
3           foo         
好的,回到#2,我知道我可以按楼层(id%5)对数据进行分组,然后按类别对数据进行分组,并获得平均值(我坚持SQL的思维方式,因为这是我熟悉的技术),以这些数据结尾会让我部分满意,但我想知道如何创建带扣的聚合以及使用哪种工具(应该使用蜂巢、火花或其他),这样我就可以解决现实世界中的问题:

步骤4

我从步骤#1中获得了数据,按id排序。现在我将桶大小更改为11。我想:

  • 找到一个类别,我们称之为X
  • 从具有(X.id-5)>=id SQL的数据创建bucket ish方法(定义一个将记录映射到类别的函数)是一种很好的方法,用SQL(Hive、Spark SQL)来表示非常简单或者DataFrame API。您在步骤#4中描述的迭代过程不是。很难进行扩展,并且依赖于数据,结果资源利用率很低。SQL-ish方法(定义一个将记录映射到类别的函数)是一种很好的方法,用SQL(Hive、Spark SQL)来表示非常简单或者DataFrame API。您在步骤#4中描述的迭代过程不是。它很难扩展,并且依赖于数据,结果资源利用率很低。
    bucket_no | category  | AVG(value)
    1           foo         4
                foo2        7
    2           foo         1
                foo2        5
    3           foo         
    
    bucket_no | category | subcategory | AVG(value)
    1           foo        bar           4
    2           foo2       bar1          7
                           bar           5
    3           foo        bar2          1
    4           foo        bar           10