在Spark dataframe列中获取最大值的最佳方法
这篇文章展示了如何在表上运行聚合(distinct、min、max),如下所示:
for colName in df.columns:
dt = cd[[colName]].distinct().count()
mx = cd.agg({colName: "max"}).collect()[0][0]
mn = cd.agg({colName: "min"}).collect()[0][0]
print(colName, dt, mx, mn)
您可以使用pyspark.sql.dataframe.description()
获取所有列的聚合统计信息,如count、mean、min、max和标准偏差。(如果不传递任何参数,则默认情况下返回所有列的统计信息)
df = spark.createDataFrame(
[(1, "a"),(2, "b"), (3, "a"), (4, None), (None, "c")],["id", "name"]
)
df.describe().show()
#+-------+------------------+----+
#|summary| id|name|
#+-------+------------------+----+
#| count| 4| 4|
#| mean| 2.5|null|
#| stddev|1.2909944487358056|null|
#| min| 1| a|
#| max| 4| c|
#+-------+------------------+----+
如您所见,这些统计信息忽略了任何null
值。
如果您使用的是spark版本2.3,那么还有pyspark.sql.dataframe.summary()
支持以下聚合:
df.summary("count", "min", "max").show()
#+-------+------------------+----+
#|summary| id|name|
#+-------+------------------+----+
#| count| 4| 4|
#| min| 1| a|
#| max| 4| c|
#+-------+------------------+----+
import pyspark.sql.functions as f
from itertools import chain
agg_distinct = [f.countDistinct(c).alias("distinct_"+c) for c in df.columns]
agg_max = [f.max(c).alias("max_"+c) for c in df.columns]
agg_min = [f.min(c).alias("min_"+c) for c in df.columns]
agg_nulls = [f.count(f.when(f.isnull(c), c)).alias("nulls_"+c) for c in df.columns]
df.agg(
*(chain.from_iterable([agg_distinct, agg_max, agg_min, agg_nulls]))
).show()
#+-----------+-------------+------+--------+------+--------+--------+----------+
#|distinct_id|distinct_name|max_id|max_name|min_id|min_name|nulls_id|nulls_name|
#+-----------+-------------+------+--------+------+--------+--------+----------+
#| 4| 3| 4| c| 1| a| 1| 1|
#+-----------+-------------+------+--------+------+--------+--------+----------+
虽然此方法将返回一行,而不是像description()
和summary()
那样返回一行。
平均值 # statistics_mean.py from statistics import * data = [1, 2, 2, 5, 10, 12] print('{:0.2f}'.format(mean(data))) # statistics_mode.py from statistics import * data = [1, 2, 2, 5, 10, 12] print(m
9.3 并行计算* 计算思维是建立在计算机的能力和限制之上的,计算机科学家的任务是尽量发扬计算机 的能力,避开计算机的限制。传统的计算概念是在计算机发明之初形成的,就是由一个处理 器按顺序执行一个程序的所有指令。并行计算则突破了这种限制,试图让多个处理器同时做 事情。并行计算的好处是显然的,想想一个人吃一锅饭与一百个人同时吃一锅饭的差别,就 能理解并行计算的威力。 可以在不同层次上讨论并行。最底层
MXNet后端会自动构建计算图。通过计算图,系统可以知道所有计算的依赖关系,并可以选择将没有依赖关系的多个任务并行执行来获得计算性能的提升。例如“异步计算”一节的第一个例子里依次执行了a = nd.ones((1, 2))和b = nd.ones((1, 2))。这两步计算之间并没有依赖关系,因此系统可以选择并行执行它们。 通常,一个运算符会用到所有CPU或单块GPU上全部的计算资源。例如,dot
如果说Go有什么让人一见钟情的特性,那大概就是并行计算了吧。 做个题目 如果我们列出10以下所有能够被3或者5整除的自然数,那么我们得到的是3,5,6和9。这四个数的和是23。 那么请计算1000以下(不包括1000)的所有能够被3或者5整除的自然数的和。 这个题目的一个思路就是: (1) 先计算1000以下所有能够被3整除的整数的和A, (2) 然后计算1000以下所有能够被5整除的整数和B,
我有一个相同维数的矩阵列表,例如: 我想做的是从列表中的每个矩阵中对随机列进行多次采样,例如,在给定的样本中,要采样的列索引是:
我一直试图在Julia中使用和实现一些并行编程。 显然,这些向量将是巨大的,但为了简单起见,我只是把这个有限的大小。 我刚得到一个零的向量。我的问题是:有没有一种方法可以在Julia中使用实现这个函数,并得到与在原始函数中相同的结果?