Apache spark 现有列可以';PySpark中的数据帧过滤器找不到

Apache spark 现有列可以';PySpark中的数据帧过滤器找不到,apache-spark,pyspark,Apache Spark,Pyspark,我正在使用PySpark在我的配置单元表上执行SparkSQL records = sqlContext.sql("SELECT * FROM my_table") 它检索表的内容 当我将filter参数用作字符串时,它可以正常工作: records.filter("field_i = 3") 但是,当我尝试使用filter方法时,如文档所示 我遇到了这个错误 py4j.protocol.Py4JJavaError: An error occurred while calling o19.f

我正在使用PySpark在我的配置单元表上执行SparkSQL

records = sqlContext.sql("SELECT * FROM my_table")
它检索表的内容

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

records.filter("field_i = 3")
但是,当我尝试使用filter方法时,如文档所示

我遇到了这个错误

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
即使此字段\ i列明显存在于DataFrame对象中

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

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

在Python中,可以通过属性(df.age)或索引(df['age'])访问数据帧的列。虽然前者便于交互式数据探索,但强烈鼓励用户使用后一种形式,这种形式是经得起未来考验的,不会与同样是DataFrame类属性的列名冲突

您的字段名称可能是保留字,请尝试:

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

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

当我遇到这个错误时,我有时使用df.reset_index()函数,它似乎对我有效。我通常在进行一些转换,然后尝试访问列时发现此错误
records.filter(records['field_i'] == 3)