我想AssertPySpark DataFrame列的值在所有行中是否相同。
+----------+----------+
| A | B |
+----------+----------+
| 2.0| 0.0|
| 0.0| 0.0|
| 1.0| 0.0|
| 1.0| 0.0|
| 0.0| 0.0|
| 1.0| 0.0|
| 0.0| 0.0|
+----------+----------+
字符串
列“A”不是常数,而“B”是常数。
我尝试了两种方法:
1-检查stddev = 0:
df.select(stddev(col('B'))).collect()
型
2-获取不同的值:
df.select("B").distinct().collect()
型
第一个方法需要16分钟才能完成,第二个需要12分钟,但这只是一次执行,所以我不确定是否有意义。
在PySpark中检查它的最佳方法是什么?
2条答案
按热度按时间o8x7eapl1#
stdev
是非常复杂的操作,distinct
也是。如果你的任务是检查特定列中的所有值是否等于某个特定变量,我会尝试像这样做。df.filter(col('B') != your_value).count() == 0
个有可能你不知道该列的值。但这很容易解决,只需检索头(任何)值并与之进行比较:
your_value = df.select('B').first()[0]
个tv6aics12#
我认为vvg的方法存在两个问题。
南虫:
如果
your_value
是nan
,则比较结果为nan
,nan
通过filter
转换为false
,导致第一个值为nan
的列被视为常数。效率低下:
计数和检查是否为零似乎是一个非常低效的方法来做
any
。考虑在计数之前调用limit,take或head。总计:
字符串