PySpark中的DataFrame#filter无法找到现有列

时间:2015-07-09 13:08:39

标签: apache-spark pyspark

我正在使用PySpark在我的Hive表上执行SparkSQL。

records = sqlContext.sql("SELECT * FROM my_table")

检索表的内容。

当我将filter参数用作字符串时,它可以正常工作:

records.filter("field_i = 3")

但是,当我尝试使用过滤方法时,如记录here

records.filter(records.field_i == 3)

我遇到了这个错误

py4j.protocol.Py4JJavaError: An error occurred while calling o19.filter.
: org.apache.spark.sql.AnalysisException: resolved attributes field_i missing from field_1,field_2,...,field_i,...field_n

尽管这个field_i列明显存在于DataFrame对象中。

我更喜欢使用第二种方式,因为我需要使用Python函数来执行记录和字段操作。

我在Cloudera Quickstart CDH-5.4.0和Python 2.6中使用Spark 1.3.0。

2 个答案:

答案 0 :(得分:2)

来自Spark DataFrame documentation

  

在Python中,可以通过属性(df.age)或索引(df [' age'])访问DataFrame的列。虽然前者便于交互式数据探索,但强烈建议用户使用后一种形式,这是未来的证明,不会破坏也是DataFrame类属性的列名。

您的字段名称似乎是保留字,请尝试使用:

records.filter(records['field_i'] == 3)

答案 1 :(得分:0)

我所做的是在Cloudera Quick Start CDH-5.4.0中将我的Spark从1.3.0升级到1.4.0,第二个过滤功能正常工作。虽然我仍然无法解释为什么1.3.0会出现问题。