是否有一种有效的方法来创建成千上万列的直方图与数百万行的表?



我是大数据的新手。我有几个大表(~TB规模),其中包含不同月份的数据,我试图分析特征漂移。我特别想计算连续两个月对应列的KL散度。在计算KL散度之前,我需要得到列的概率分布,这意味着创建一个直方图,在这里我可以有箱子和计数。归一化计数数组将为我提供使用scipy熵函数计算KL散度所需的概率分布。

我正在分析的表有数百万行和大约2000列/特征,并且都在BigQuery中。我试过用两种不同的工具来解决这个问题。

(我使用Python的所有方法)

1-我尝试使用Pyspark,它需要70秒来计算一个表的一个单列的箱子和计数。这样的话,我需要花几周的时间来完成所有的功能和表。

2-我利用大查询python api并创建python函数来批量创建长查询(例如批量10列),以计算每个列的bin和计数。对于使用大查询计算箱子和计数,我使用了"CASE WHEN"bigquery的功能并将我的值设置为预定义的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]
...

使用big query,计算每列只需要0.5秒(整个计算不到2小时,而不是一周)。然而,如果我在两个表上处理10个批次,我将在大约10个批次后用完QueryQuotaPerDayPerUser(注意,我需要2000/10=200个批次)。如果我将批处理大小增加到更大的值,我会得到&;BadRequest: 400资源超过....&;(注意:每个批处理本质上产生一个长查询,批处理越大,查询越长)。

我不知道如何解决这个问题。任何帮助或建议都是感激的

看来您更多的是配额问题而不是性能问题。

如果我理解正确的话,您遇到了这里定义的配额超出错误,因为您试图扫描一个比bigquery管理员设置的每日配额太大的表。

如果您开放配额增加,您可以按照说明通过控制台提交请求。如果您不能让管理员增加这个配额,表抽样可能会有所帮助。

如果性能是问题,您可以轻松地从python并行运行bigquery查询。如果有50个并行查询,你的2h作业只会持续2.4分钟。考虑使用批处理查询模式,避免遇到"并发请求太多"的问题。

最新更新