【问题标题】:Error using filter on column value with Spark dataframe使用 Spark 数据框对列值使用过滤器时出错
【发布时间】:2019-06-10 14:01:46
【问题描述】:

请参考下面我的示例代码:

sampleDf -> 我想在 2 列 startIPIntendIPInt 上过滤的示例 Scala 数据帧。

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)

谁能帮我理解这里发生了什么?这是过滤和获取上述数据帧内容的正确和最快的方法。

【问题讨论】:

    标签: scala apache-spark dataframe apache-spark-sql


    【解决方案1】:

    首先,使用filter 您并没有真正获得行/行对象,您将获得一个新的数据框。

    show 执行时间较长的原因是 Spark 比较懒惰。它只会在对数据帧执行操作时计算转换(参见例如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)
    

    是等价的,只要您导入了 spark 隐式(使用 $ 表示法),应该给出相同的结果。

    【讨论】:

      猜你喜欢
      • 2021-05-13
      • 1970-01-01
      • 2016-09-12
      • 1970-01-01
      • 2017-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-04
      相关资源
      最近更新 更多