我正在处理一个包含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进行此类查询的有效方法吗?
此致