过滤Spark Dataframe中的列以查找每个元素的百分比



我试图用pyspark过滤Spark Dataframe中的列,我想知道哪些记录代表10%或小于总列,

例如,我在我的DataFrame中有以下标题为"Animal"的列:

  • 老鼠

为了找到唱片"Rat",我尝试了

df.filter(df.groupBy("Animal").count() <= 0.1 * df.select("Animal").count()).collect()

,我得到了以下错误" TypeError: condition应该是字符串或列"

如何查找占比小于10%的记录?

PS:在SQL中会更简单吗?

例如:

result = spark.sql("SELECT Animal, COUNT(ANIMAL) FROM Table HAVING COUNT(Animal) < 0.1 * COUNT(Animal))

我知道这是一个简单的操作,但我只是不知道如何编码占总零件的10%。

感谢您的帮助

首先要计算总数,然后在第二步中使用它来筛选。

压缩代码(pyspark, spark 2.0):

import pyspark.sql.functions as F
df=sqlContext.createDataFrame([['Cat'],['Cat'],['Dog'],['Dog'],
    ['Cat'],['Cat'],['Dog'],['Dog'],['Cat'],['Rat']],['Animal'])
total=df.count()
result=(df.groupBy('Animal').count()
    .withColumn('total',F.lit(total))
    .withColumn('fraction',F.expr('count/total'))
    .filter('fraction>0.1'))
result.show()

给了结果:

+------+-----+-----+--------+
|Animal|count|total|fraction|
+------+-----+-----+--------+
|   Dog|    4|   10|     0.4|
|   Cat|    5|   10|     0.5|
+------+-----+-----+--------+

过滤初始设置:

filtered=df.join(result,df.Animal==result.Animal,'leftsemi')
filtered.show()

'leftsemi'连接保留df中结果

中具有匹配键的记录。

相关内容

  • 没有找到相关文章

最新更新