【问题标题】:Existing column can't be found by DataFrame#filter in PySparkPySpark 中的 DataFrame#filter 找不到现有列
【发布时间】:2015-07-17 17:11:19
【问题描述】:

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

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

检索表的内容。

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

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 快速入门 CDH-5.4.0 和 Python 2.6 中使用 Spark 1.3.0。

【问题讨论】:

    标签: apache-spark pyspark


    【解决方案1】:

    来自Spark DataFrame documentation

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

    看来你的字段名可以是保留字,试试:

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

    【讨论】:

      【解决方案2】:

      我所做的是在 Cloudera 快速入门 CDH-5.4.0 中将我的 Spark 从 1.3.0 升级到 1.4.0,并且第二个过滤功能有效。虽然我仍然无法解释为什么 1.3.0 有问题。

      【讨论】:

      • 当我收到这个错误时,我有时会使用 df.reset_index() 函数,它似乎对我有用。当我进行一些转换然后尝试访问该列时,我通常会发现此错误
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多