我正在使用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。
答案 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会出现问题。