pyspark 有没有一种有效的方法可以在一个有数百万行的表上创建数千列的直方图?

pn9klfpd  于 2022-12-11  发布在  Spark
关注(0)|答案(1)|浏览(114)

我不熟悉大型数据。我有几个大型表(~TB尺度),使用不同月份的数据,我试图分析特征漂移。我特别试图计算连续两个月相应列的KL散度。在计算KL散度之前,我需要获得列的概率分布,这意味着创建一个直方图,在那里我可以有bin和计数。计数的归一化数组将给予我所需要的概率分布,以便使用scipy熵函数计算KL散度。
我正在分析的表有数百万行和大约2000列/特征,并且都在BigQuery中。
(我的所有方法都使用Python)
1-我试着使用Pyspark,它需要70秒来计算一个表的一个列的垃圾桶和计数。这样的话,我需要几周的时间来计算所有的功能和表。
2-我利用big query python API并创建了python函数来批量创建长查询(例如,10列的批量),以计算每列的bin和计数。为了使用big query计算bin和计数,我使用了bigquery的“CASE WHEN”功能,并将值设置为预定义的bin中心。以下是一个示例

case when col_name1>=1 and col_name1<2 then bin_center_array[0]
     when col_name1>=2 and col_name1<3 then bin_center_array[1]
     ...

使用大查询时,计算每列只需要0.5秒(整个计算不到2小时,而不是一周)。但是,如果我对两个表执行10个批处理,我将在大约10个批处理后用完QueryQuotaPerDayPerUser(请注意,我需要2000/10=200个批处理)。如果我将批处理大小增加到更大的值,我将得到“BadRequest:超过400个资源....”错误(注意:每一批实质上产生长查询,批越大,查询越长)。
我不知道如何处理这个问题。任何帮助或建议都是感激的

jpfvwuh4

jpfvwuh41#

看起来您的配额问题比性能问题更严重。
如果我没有理解错的话,您会遇到此处定义的配额超出错误,因为您尝试扫描的表相对于bigquery管理员设置的每日配额来说太大了。
如果管理员无法增加此配额,则表采样可能会有所帮助。
如果性能是个问题,你可以很容易地在python中并行运行bigquery查询。如果有50个并行查询,你的2h作业只会持续2.4分钟。考虑使用批处理查询模式,以免遇到“太多并发请求”的问题。

相关问题