我有一个运行在EMR上的pyspark应用程序,我想监控它的一些指标。例如,对加载、保存的行进行计数。目前我使用count
操作来提取值,这显然会降低应用程序的速度。我在想是否有更好的选择从数据框架中提取这些指标?我正在使用pyspark 2.4.5
如果要计算完整的数据帧,请尝试先持久化数据帧,这样您就不必运行两次计算。
如果一个近似的计数是可以接受的,你可以在计数前采样,以加快速度。
sample_fraction = 0.01 # take a roughly 1% sample
sample_count = df.sample(fraction=sample_fraction).count() # count the sample
extrapolated_count = sample_count / sample_fraction # estimate the total count
还有一个approx_count_distinct
函数,如果您需要特定列的不同值的计数。
如果您需要精确计数,那么use parquet
或delta lake
格式来存储数据。它存储统计数据,因此计数结果很快(以秒为单位)。
如果你可以没有精确的计数,那么你可以使用Dataframe.isEmpty
,Dataframe.first
,Dataframe.head(<number of rows>)
等来补偿你的需求。