hive—并行计算列的统计信息

yi0zb3m4  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(603)

在sparkDataframe列中获取最大值的最佳方法
这篇文章展示了如何在表上运行聚合(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)

这可以很容易地通过计算统计来完成。hive和spark的数据不同:
配置单元提供-distinct、max、min、nulls、length、version
Spark给出-计数,平均值,标准偏差,最小值,最大值
看起来有很多统计数据是经过计算的。如何使用一个命令获取所有列的所有属性?
但是,我有1000个列,按顺序执行这个操作非常慢。假设我想计算另一个函数,比如每列的标准差,如何并行计算呢?

2wnc66cl

2wnc66cl1#

你可以用 pyspark.sql.DataFrame.describe() 获取所有列的聚合统计信息,如计数、平均值、最小值、最大值和标准偏差,这些统计信息适用于这些列(如果不传入任何参数,则默认情况下会返回所有列的统计信息)

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() 支持以下聚合:
count-mean-stddev-min-max-指定为百分比的任意近似百分位数(例如,75%)

df.summary("count", "min", "max").show()

# +-------+------------------+----+

# |summary|                id|name|

# +-------+------------------+----+

# |  count|                 4|   4|

# |    min|                 1|   a|

# |    max|                 4|   c|

# +-------+------------------+----+

如果您想对所有列使用其他聚合统计信息,还可以使用列表 pyspark.sql.DataFrame.agg() . 例如,如果您想复制您所说的hive提供的内容(distinct、max、min和nulls-我不确定长度和版本的含义):

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|

# +-----------+-------------+------+--------+------+--------+--------+----------+

尽管此方法将返回一行,而不是每个统计信息返回一行 describe() 以及 summary() 去吧。

pnwntuvh

pnwntuvh2#

你可以在一个句子中输入尽可能多的表达式 agg 正如你所希望的,当你收集它们的时候,它们会立刻被计算出来。结果是包含所有值的单行。举个例子:

from pyspark.sql.functions import min, max, countDistinct

r = df.agg(
  min(df.col1).alias("minCol1"),
  max(df.col1).alias("maxCol1"),
  (max(df.col1) - min(df.col1)).alias("diffMinMax"),
  countDistinct(df.col2).alias("distinctItemsInCol2"))
r.printSchema()

# root

# |-- minCol1: long (nullable = true)

# |-- maxCol1: long (nullable = true)

# |-- diffMinMax: long (nullable = true)

# |-- distinctItemsInCol2: long (nullable = false)

row = r.collect()[0]
print(row.distinctItemsInCol2, row.diffMinMax)

# (10, 9)

您也可以在这里使用字典语法,但是对于更复杂的事情,它更难管理。

相关问题