我试着用火花放电过滤一个列,我想知道哪些记录代表了10%或者更少,
例如,在我的DataFrame中有一个题为“动物”的专栏:
动物
为了找到“老鼠”的唱片,我试着
df.filter(df.groupBy("Animal").count() <= 0.1 * df.select("Animal").count()).collect()我得到了以下错误“TypeError :条件应该是字符串或列”
我怎样才能找到不到10%的记录?
PS :在SQL中会更简单吗?
类似于:
result = spark.sql("SELECT Animal, COUNT(ANIMAL) FROM Table HAVING COUNT(Animal) < 0.1 * COUNT(Animal))我知道这是一个简单的操作,但我只是不知道如何编码10%的全部部分。
谢谢你的帮助!
发布于 2016-10-16 21:08:33
您首先必须计算总数,然后在第二步中使用它进行筛选。
在精简的代码中(电火花,火花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()“左半”连接保存df中的记录,结果显示有匹配的键。
https://stackoverflow.com/questions/40071263
复制相似问题