我是全新的pyspark(也是真正的python)。我试图在每列上计算不同(不是列的不同组合)。我想要这个SQL语句的答案:
sqlStatement = "Select Count(Distinct C1) AS C1, Count(Distinct C2) AS C2, ..., Count(Distinct CN) AS CN From myTable"
distinct_count = spark.sql(sqlStatement).collect()
在8节点集群上需要永久(16小时)(请参阅下面的配置)。我正在尝试使用400列优化100GB数据集。我没有看到使用dataframe sql原语的方法,如:
df.agg(countDistinct('C1', 'C2', ..., 'CN'))
因为这将再次给我独特的组合。必须有办法让这个快。
主节点
标准(1名主人,N名工人)
机器类型
n1-highmem-8(8个vCPU,52.0 GB内存)
主磁盘大小
500 GB
工人节点
8
机器类型
n1-highmem-4(4个vCPU,26.0 GB内存)
主磁盘大小
500 GB
本地SSD
1
答案 0 :(得分:1)
请注意,您正在使用.collect()
方法,该方法会将数据集的所有元素返回给驱动程序,这可能会导致驱动程序用尽内存。有关说明,请参见this link。
通过在查询中运行.explain()
,可以查看正在传递的内容:
myquery = spark.sql(sqlStatement)
myquery.explain()
您可以通过将查询拆分为多个查询来缓解此问题,这样就不必一次在每个列上计算distinct()
。这将减少一次传递的数据量。