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

时间:2018-03-20 00:33:39

标签: python python-2.7 apache-spark pyspark spark-dataframe

我有以下数据(你可以通过复制和粘贴来重现它):

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

2 个答案:

答案 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)

df.groupBy('value')。count()。show()将按照@pault的说明进行操作。

对于多维数据集,添加“过滤器”方法对我有用

df.cube("value").count().filter(  col('count')<df.count()  ).show()

但是添加了一个额外的过程。在我使用cube()的工作中看到屏幕截图。

See my example