gpt4 book ai didi

python - pyspark dataframe cube 方法返回重复的空值

转载 作者:行者123 更新时间:2023-11-28 18:14:31 27 4
gpt4 key购买 nike

我有以下数据(你可以通过复制粘贴的方式重现):

from pyspark.sql import Row
l = [Row(value=True), Row(value=True), Row(value=True), Row(value=True), Row(value=None), Row(value=True), Row(value=True), Row(value=True), Row(value=None), Row(value=None), Row(value=True), Row(value=None), Row(value=True), Row(value=None), Row(value=True), Row(value=True), Row(value=None), Row(value=True), Row(value=True), Row(value=True), Row(value=None), Row(value=True), Row(value=None), Row(value=True), Row(value=True), Row(value=None), Row(value=True), Row(value=True), Row(value=True), Row(value=True), Row(value=None), Row(value=True), Row(value=True), Row(value=True), Row(value=None), Row(value=True), Row(value=None), Row(value=True), Row(value=True), Row(value=True), Row(value=True), Row(value=True), Row(value=True), Row(value=None), Row(value=True), Row(value=True), Row(value=True), Row(value=True), Row(value=None), Row(value=True), Row(value=None), Row(value=True), Row(value=True), Row(value=True), Row(value=None), Row(value=True), Row(value=None), Row(value=True), Row(value=True), Row(value=True), Row(value=True), Row(value=None), Row(value=True), Row(value=True), Row(value=True), Row(value=None), Row(value=True), Row(value=True), Row(value=None), Row(value=True), Row(value=True), Row(value=None), Row(value=True), Row(value=True), Row(value=True), Row(value=None), Row(value=True), Row(value=True), Row(value=True), Row(value=None), Row(value=True), Row(value=True), Row(value=None), Row(value=None), Row(value=None), Row(value=None), Row(value=True), Row(value=None), Row(value=True), Row(value=True), Row(value=True), Row(value=True), Row(value=True), Row(value=None), Row(value=None), Row(value=None), Row(value=True), Row(value=None), Row(value=True), Row(value=None)]
l_df = spark.createDataFrame(l)

让我们看一下l_df的架构:

l_df.printSchema()

root
|-- value: boolean (nullable = true)

现在我想使用 cube() 来计算 value 列中每个不同值的频率:

l_df.cube("value").count().show()

但是我看到了两种类型的 null 值!

+-----+-----+
|value|count|
+-----+-----+
| true| 67|
| null| 100|
| null| 33|
+-----+-----+

验证我实际上没有两种类型的null:

l_df.select("value").distinct().collect()

而且确实只有一种类型的null:

[Row(value=None), Row(value=True)]

只是为了仔细检查:

l_df.select("value").distinct().count()

它返回 2

我还注意到 len(l)100 并且第一个 null 等于这个数字。为什么会这样?

系统信息:Spark 2.1.0、Python 2.7.8、[GCC 4.1.2 20070626 (Red Hat 4.1.2-14)] on linux2

最佳答案

这不是两种类型的空值,而是不同级别聚合的结果。如 What is the difference between cube, rollup and groupBy operators? 中所述您的 cube 应用程序相当于:

SELECT NULL AS value, COUNT(*) FROM df
UNION ALL
SELECT value, COUNT(*) FROM df GROUP BY value

第一个查询生成元组 (null, 100)(记录总数),其中 NULL 只是一个占位符,第二个查询生成元组 ( true, 67), (null, 33) 其中 NULLvalue 列的级别之一。

grouping(或grouping_id)很容易检查:

from pyspark.sql.functions import grouping, count

l_df.cube("value").agg(count("*"), grouping("value")).show()
# +-----+--------+---------------+
# |value|count(1)|grouping(value)|
# +-----+--------+---------------+
# | true| 67| 0|
# | null| 100| 1|
# | null| 33| 0|
# +-----+--------+---------------+

关于python - pyspark dataframe cube 方法返回重复的空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49374608/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com