在 pyspark shell 中工作的过滤器不是 spark-submit

Posted

技术标签:

【中文标题】在 pyspark shell 中工作的过滤器不是 spark-submit【英文标题】:filter working in pyspark shell not spark-submit 【发布时间】:2018-08-02 19:42:59 【问题描述】:

df_filter = df.filter(~(col('word').isin(stop_words_list)))

df_filter.count()

27781

df.count()

31240

使用 spark-submit 向 Spark 集群提交相同的代码时,过滤功能无法正常工作,stop_words_list 中带有 col('word') 的行没有被过滤。 为什么会这样?

【问题讨论】:

您能否提供一个您提交的spark-submit 示例以及预期输出应该是什么? spark-提交 pyspark-file.py。我预计过滤后的记录数为 27781。但是,提交代码后,火花数据框保持不变!根本没有过滤! 您是否期望在df_filter 行中运行过滤后,df 也会有 27,781 条记录,因为过滤已被应用?因为在您的代码中过滤是有效的。 df_filter 的行数比 df 少,因此您认为过滤不起作用的原因令人困惑。 Spark 是一个懒惰的解释器。当您过滤数据框时,您将其分配给一个新变量df_filter。当您稍后致电df.count() 时,将不会应用该过滤器。 在我的实际代码中,我不断更新'df'并通过下面的代码监控行数。 df=df.filter(~(col('word').isin(stop_words_list))) df.count()。我期望过滤后更新的行数。但是,过滤在 pyspark shell 中工作,但在我使用 spark-submit 将代码提交到 spark 集群时却没有。 【参考方案1】:

修剪 col('word') 后,过滤现在开始工作。 df_filter = df.filter(~(trim(col("word")).isin(stop_words_list))) 我仍然不知道为什么它在 pyspark shell 中有效,但在 spark-submit 中无效。它们的唯一区别是:在 pyspark shell 中,我使用 spark.read.csv() 读取文件,而在 spark-submit 中,我使用以下方法。 from pyspark.sql import SparkSession from pyspark.sql import SQLContext session = pyspark.sql.SparkSession.builder.appName('test').getOrCreate() sqlContext = SQLContext(session) df = sqlContext.read.format("com.databricks.spark.csv").option('header','true').load() 我不确定是否有两种不同的读入方法导致了这种差异。熟悉这个的人可以澄清一下。

【讨论】:

【参考方案2】:

尝试使用双引号而不是单引号。

from pyspark.sql.functions import col
df_filter = df.filter(~(col("word").isin(stop_words_list))).count()

【讨论】:

谢谢!尝试在列名周围加上双引号!还是不行! 你试过 from pyspark.sql.functions import col 我之前导入了 col 函数。否则会报错! 请提供您收到的错误消息。 没有错误信息。我只是想找出为什么我上面的过滤在 pyspark shell 中有效,而不是在 spark-submit 中。

以上是关于在 pyspark shell 中工作的过滤器不是 spark-submit的主要内容,如果未能解决你的问题,请参考以下文章

包含不在 Powershell 中工作的运算符

在 Chrome 中工作的 SVG 上 CSS 动画的 transform-origin,而不是 FF

从 Java 启动 OpenOffice 服务 (soffice) 的问题(在命令行中工作的命令,但不是从 Java 中)

用于在Firefox中工作的网站的Facebook Messenger,而不是Chrome

关于管道如何在 Bash 中工作的简单解释是啥?

无法获取在GLSL 1.5中工作的整数顶点属性