在PySpark框架中知道一个列是否有常量值的最快方法

rqcrx0a6  于 12个月前  发布在  Spark
关注(0)|答案(2)|浏览(179)

我想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中检查它的最佳方法是什么?

o8x7eapl

o8x7eapl1#

stdev是非常复杂的操作,distinct也是。如果你的任务是检查特定列中的所有值是否等于某个特定变量,我会尝试像这样做。
df.filter(col('B') != your_value).count() == 0
有可能你不知道该列的值。但这很容易解决,只需检索头(任何)值并与之进行比较:
your_value = df.select('B').first()[0]

tv6aics1

tv6aics12#

我认为vvg的方法存在两个问题。

南虫:

如果your_valuenan,则比较结果为nannan通过filter转换为false,导致第一个值为nan的列被视为常数。

效率低下:

计数和检查是否为零似乎是一个非常低效的方法来做any。考虑在计数之前调用limit,take或head。

总计:

first_value = df.select('B').filter(~F.col('B').isNull()).first()[0]
df.filter(col('B') != first_value).limit(1).count() == 0

字符串

相关问题