中具有匹配键的记录。
我试图用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中结果