apache spark - 现有列无法通过 PySpark 中的 DataFrame#filter 找到



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

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

,用于检索表的内容。

当我使用过滤器参数作为字符串时,它工作正常:

records.filter("field_i = 3")

但是,当我尝试使用过滤器方法时,如这里所述

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函数来执行记录和字段操作。

我使用Spark 1.3.0在Cloudera快速入门CDH-5.4.0和Python 2.6.

来自Spark DataFrame文档

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

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

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

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

最新更新