我需要为大量列(> 20,000)计算不同的值。我现在使用pyspark.sql.functions.approxCountDistinct()来获得每列的不同计数的近似值。这是超快(HyperLogLog)。之后,如果非重复计数低于某个阈值(如10),我们需要这些值。我有一个循环来做到这一点。
distinct_values_list[cname] = df.select(cname).distinct().collect()
这是非常慢的,因为大多数时候,我有很多列要处理,可能是列的一半(10K)。有没有办法让火花一次做多列?似乎它只会并行化每列但不能同时执行多列。
感谢我能得到的任何帮助。
答案 0 :(得分:1)
(更新) 不确定,它足够快但你可能想尝试
import pyspark.sql.functions as F
df.select(*[
F.collect_set(c).alias(c)
for c in LIST_10k_COLS
]).collect()
答案 1 :(得分:0)
假设每列中只有2个值。然后,唯一组合的数量是2 ^ 20000 = ~10 ^ 7000。这是1,有7000个零。如果某些列中的值超过2,则此数字将更高。
修改您的模型。所有列都是独立的吗?是否许多这些列只代表相同维度的不同值?那么你可以基本上减少列数。
考虑您是否使用了正确的工具。可能是一些完全不同的方法(Neo4j,......)更适合?