我有以下数据(你可以通过复制和粘贴来重现它):
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
答案 0 :(得分:1)
这些不是两种类型的空值,而是不同级别聚合的结果。正如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)
其中{{ 1}}是NULL
列的其中一个级别。
使用value
(或grouping
)检查很容易:
grouping_id
答案 1 :(得分:0)