首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >筛选Spark中的列以查找每个元素的百分比

筛选Spark中的列以查找每个元素的百分比
EN

Stack Overflow用户
提问于 2016-10-16 14:12:39
回答 1查看 2.9K关注 0票数 2

我试着用火花放电过滤一个列,我想知道哪些记录代表了10%或者更少,

例如,在我的DataFrame中有一个题为“动物”的专栏:

动物

  • 速率

为了找到“老鼠”的唱片,我试着

代码语言:javascript
复制
df.filter(df.groupBy("Animal").count() <= 0.1 * df.select("Animal").count()).collect()

我得到了以下错误“TypeError :条件应该是字符串或列”

我怎样才能找到不到10%的记录?

PS :在SQL中会更简单吗?

类似于:

代码语言:javascript
复制
result = spark.sql("SELECT Animal, COUNT(ANIMAL) FROM Table HAVING COUNT(Animal) < 0.1 * COUNT(Animal))

我知道这是一个简单的操作,但我只是不知道如何编码10%的全部部分。

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-16 21:08:33

您首先必须计算总数,然后在第二步中使用它进行筛选。

在精简的代码中(电火花,火花2.0):

代码语言:javascript
复制
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()

给出的结果:

代码语言:javascript
复制
+------+-----+-----+--------+
|Animal|count|total|fraction|
+------+-----+-----+--------+
|   Dog|    4|   10|     0.4|
|   Cat|    5|   10|     0.5|
+------+-----+-----+--------+

若要筛选初始集:

代码语言:javascript
复制
filtered=df.join(result,df.Animal==result.Animal,'leftsemi')
filtered.show()

“左半”连接保存df中的记录,结果显示有匹配的键。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40071263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档