请参阅下面的示例代码:
sampleDf
->是我的样本Scala,我想在2列startIPInt
和endIPInt
上进行过滤。
var row = sampleDf.filter("startIPInt <=" + ip).filter("endIPInt >= " + ip)
现在我想查看这一行的内容。以下内容仅需一秒钟即可执行,但未显示此行对象的内容:
println(row)
但是这段代码执行起来太长了:
row.show()
因此,我的问题是如何查看这个行对象的内容?或者我过滤数据的方式有什么问题吗?
我最初的方法是使用过滤器,如这里所提到的:https://spark.apache.org/docs/1.5.0/api/java/org/apache/spark/sql/DataFrame.html#filter(java.lang.String)
根据这一点,下面的代码行给出了一个关于“重载方法‘过滤器’”的错误:
var row = sampleDf.filter($"startIPInt" <= ip).filter($"endIPInt" >= ip)
有人能帮我理解这里发生了什么吗?这是过滤和获取数据文件内容的正确和最快的方法,如上面所示。
发布于 2019-06-03 18:28:05
首先,使用filter
并不能真正得到一个行/行对象,您将得到一个新的dataframe。
show
执行时间较长的原因是斯帕克懒惰。它只在对数据文件采取行动时才计算转换(例如,请参阅Spark Transformation - Why its lazy and what is the advantage?)。对数据帧使用println
不会做任何事情,而且过滤器转换也不会被实际计算出来。另一方面,show
需要一些计算,这就是为什么执行速度较慢的原因。
使用
sampleDf.filter("startIPInt <=" + ip).filter("endIPInt >= " + ip)
和
sampleDf.filter($"startIPInt" <= ip).filter($"endIPInt" >= ip)
它们是等价的,并且应该给出相同的结果,只要你已经导入火花注入(为了使用$
符号)。
https://stackoverflow.com/questions/56436426
复制相似问题