Spark - SELECT WHERE还是过滤?

时间:2016-08-10 08:01:09

标签: apache-spark apache-spark-sql

使用where子句选择和使用Spark过滤之间的区别是什么?
是否存在一个比另一个更合适的用例?

我何时使用

DataFrame newdf = df.select(df.col("*")).where(df.col("somecol").leq(10))

何时

DataFrame newdf = df.select(df.col("*")).filter("somecol <= 10")

更合适?

2 个答案:

答案 0 :(得分:48)

根据spark documentation chart: { type: 'column' }, xAxis: { type: 'category' }, plotOptions: { series: { dataLabels: { enabled: true, formatter: function () { return '<b >'+Math.round(this.point.y)+'%</b>'+'<br> <b >(N='+ this.point.count + ')</b>'; } } } } where()的别名

filter() 使用给定条件过滤行。 filter(condition)where()的别名。

参数:condition - filter() Column或一串SQL表达式。

types.BooleanType

答案 1 :(得分:3)

正如Yaron所说,wherefilter之间没有任何区别。

filter是一个重载方法,它采用列或字符串参数。无论使用哪种语法,性能都是相同的。

filter overloaded method

我们可以使用explain()来查看所有不同的过滤语法都生成相同的物理计划。假设您有一个包含person_nameperson_country列的数据集。以下所有代码段都将在下面返回相同的物理计划:

df.where("person_country = 'Cuba'").explain()
df.where($"person_country" === "Cuba").explain()
df.where('person_country === "Cuba").explain()
df.filter("person_country = 'Cuba'").explain()

这些都将返回此身体计划:

== Physical Plan ==
*(1) Project [person_name#152, person_country#153]
+- *(1) Filter (isnotnull(person_country#153) && (person_country#153 = Cuba))
   +- *(1) FileScan csv [person_name#152,person_country#153] Batched: false, Format: CSV, Location: InMemoryFileIndex[file:/Users/matthewpowers/Documents/code/my_apps/mungingdata/spark2/src/test/re..., PartitionFilters: [], PushedFilters: [IsNotNull(person_country), EqualTo(person_country,Cuba)], ReadSchema: struct<person_name:string,person_country:string>

语法不会改变后台执行过滤器的方式,但是执行查询的文件格式/数据库却可以。 Spark将在Postgres(支持谓词下推过滤),Parquet(列修剪)和CSV文件上以不同的方式执行同一查询。 See here了解更多详情。