【问题标题】:Is there an efficient way to create histogram of thousands of columns on a table with millions of rows?有没有一种有效的方法可以在具有数百万行的表上创建数千列的直方图?
【发布时间】:2022-12-20 11:45:07
【问题描述】:

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

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

(我的所有方法都使用 Python)

1- 我尝试使用 Pyspark 并且只需要 70 秒来计算一张表的一列的 bins 和计数。以这种方式,我需要数周时间才能完成我拥有的所有功能和表格。

2- 我利用大查询 python api 并创建了 python 函数来批量创建长查询(例如 10 列的批次)来计算每列的 bins 和计数。为了使用大查询计算 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 个资源......”错误(注意:每个批处理本质上都会产生一个长查询,批处理越大,查询越长)。

我不确定如何解决这个问题。任何帮助或建议表示赞赏

【问题讨论】:

标签: python pyspark google-bigquery bigdata


【解决方案1】:

看来您的配额问题多于性能问题。

如果我理解正确的话,你会遇到 here 定义的超出配额的错误,因为你尝试扫描的表对于你的 bigquery 管理员设置的每日配额来说太大了。

如果您愿意增加配额,您可以通过instructions 之后的控制台提交请求。 如果您不能让管理员增加此配额,table sampling 可能会有所帮助。

如果性能是问题,您可以轻松地从 python 并行运行 bigquery 查询。对于 50 个并行查询,您的 2 小时工作将只持续 2.4 分钟。考虑使用batch query mode,以免遇到“并发请求过多”问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 2010-09-06
    • 2014-01-10
    • 2011-01-04
    • 2013-03-08
    • 2012-05-29
    相关资源
    最近更新 更多