pyspark计数在每列上不同

时间:2018-05-14 21:43:37

标签: python apache-spark pyspark pyspark-sql google-cloud-dataproc

我是全新的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

1 个答案:

答案 0 :(得分:1)

请注意,您正在使用.collect()方法,该方法会将数据集的所有元素返回给驱动程序,这可能会导致驱动程序用尽内存。有关说明,请参见this link

通过在查询中运行.explain(),可以查看正在传递的内容:

myquery = spark.sql(sqlStatement)
myquery.explain()

您可以通过将查询拆分为多个查询来缓解此问题,这样就不必一次在每个列上计算distinct()。这将减少一次传递的数据量。