有没有类似于PySpark中的sql窗口函数的高效方法?

时间:2017-11-29 12:04:26

标签: performance pyspark bigdata pyspark-sql

我正在处理一个包含3列和5 Bil的巨大数据帧。行。数据大小为360 GB。对于数据的分析,我使用以下设置:

-Jupyternotebooks在AWS r4.16xlarge上运行

-PySpark Kernel

名为customer_sales的表类似于以下示例:

    +--------------------+----------+-------+
    |  business_unit_id  | customer | sales |
    +--------------------+----------+-------+
    |                  1 +        a +  5000 +
    |                  1 +        b +  2000 +
    |                  1 +        c +  3000 +
    |                  1 +        d +  5000 +
    |                  2 +        f +   600 +
    |                  2 +        c +  7000 +
    |                  3 +        j +   200 +
    |                  3 +        k +   800 +
    |                  3 +        c +  4500 +

现在,我希望每个business_unit_id获得customer sales sales。如果customer之间有几个best_customers_for_each_unit之间的平局我希望全部获得。该信息应存储在名为best_customers_for_each_unit的表中。因此,对于上面举例说明的示例,表 +--------------------+----------+-------+ | business_unit_id | customer | sales | +--------------------+----------+-------+ | 1 + a + 5000 + | 1 + d + 5000 + | 2 + c + 7000 + | 3 + c + 4500 + 如下所示:

customer

在第二步中,我想计算sales在特定business_unit_id中具有最高 +----------+-------+ | customer | count | +----------+-------+ | a + 1 + | b + 1 + | c + 2 + 的那个频率。此查询的输出将为:

     best_customers_for_each_unit = spark.sql("""
     SELECT 
          business_unit_id,
          customer,
          sales
     FROM (
          SELECT
             business_unit_id,
             customer,
             sales,
             dense_rank() OVER (PARTITION BY business_unit_id ORDER BY sales DESC)as rank
          FROM customer_sales) tmp
     WHERE
     rank =1
     """)

对于第一个查询,我使用带有窗口函数的spark.sql。使用的查询如下所示:

     best_customers_for_each_unit.groupBy("customer").count()

对于第二个查询,我使用了以下PySpark剪切:

my_dict = {'B01' : 23, 'B03': 35, 'B26' : 102} #Bnn between B01 and B30

我的查询确实有效,但只处理一小部分数据需要很长时间。所以你知道用PySpark进行此类查询的有效方法吗?

此致

0 个答案:

没有答案