首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用对列值使用过滤器时出错

使用对列值使用过滤器时出错
EN

Stack Overflow用户
提问于 2019-06-04 01:54:00
回答 1查看 646关注 0票数 0

请参阅下面的示例代码:

sampleDf ->是我的样本Scala,我想在2列startIPIntendIPInt上进行过滤。

代码语言:javascript
代码运行次数:0
运行
复制
var row = sampleDf.filter("startIPInt <=" + ip).filter("endIPInt >= " + ip)

现在我想查看这一行的内容。以下内容仅需一秒钟即可执行,但未显示此行对象的内容:

代码语言:javascript
代码运行次数:0
运行
复制
println(row)

但是这段代码执行起来太长了:

代码语言:javascript
代码运行次数:0
运行
复制
row.show()

因此,我的问题是如何查看这个行对象的内容?或者我过滤数据的方式有什么问题吗?

我最初的方法是使用过滤器,如这里所提到的:https://spark.apache.org/docs/1.5.0/api/java/org/apache/spark/sql/DataFrame.html#filter(java.lang.String)

根据这一点,下面的代码行给出了一个关于“重载方法‘过滤器’”的错误:

代码语言:javascript
代码运行次数:0
运行
复制
var row = sampleDf.filter($"startIPInt" <= ip).filter($"endIPInt" >= ip)

有人能帮我理解这里发生了什么吗?这是过滤和获取数据文件内容的正确和最快的方法,如上面所示。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-04 02:28:05

首先,使用filter并不能真正得到一个行/行对象,您将得到一个新的dataframe。

show执行时间较长的原因是斯帕克懒惰。它只在对数据文件采取行动时才计算转换(例如,请参阅Spark Transformation - Why its lazy and what is the advantage?)。对数据帧使用println不会做任何事情,而且过滤器转换也不会被实际计算出来。另一方面,show需要一些计算,这就是为什么执行速度较慢的原因。

使用

代码语言:javascript
代码运行次数:0
运行
复制
sampleDf.filter("startIPInt <=" + ip).filter("endIPInt >= " + ip)

代码语言:javascript
代码运行次数:0
运行
复制
sampleDf.filter($"startIPInt" <= ip).filter($"endIPInt" >= ip)

它们是等价的,并且应该给出相同的结果,只要你已经导入火花注入(为了使用$符号)。

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

https://stackoverflow.com/questions/56436426

复制
相关文章

相似问题

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