【问题标题】:Why does spark not recognize my "dataframe boolean expression"?为什么 spark 无法识别我的“数据框布尔表达式”?
【发布时间】:2021-07-09 11:50:32
【问题描述】:

环境

  • pyspark 2.1.0
  • python 3.5.2

问题

我有多个条件的连接:

join_cond = [
    (col("ltmr1.anc_ref") == col("global.anc_ref") &
     col("global.straight_distance") >= args.radius_1 &
     col("global.straight_distance") <= args.radius_2)
]

后面会用到:

ltm_r1_in_r2 = data_with_straight_distance.alias("global") \
    .join(
        less_than_min_r1.select(
            col("anc_ref"),
            col("num_rep")
        ).alias("ltmr1"),
        join_cond,
        "leftsemi"
)

程序在以下行失败:

col("global.straight_distance") >= args.radius_1 &

其中args 是来自argparse 的元组。

相关堆栈跟踪:

  File "/mnt/mesos/sandbox/full_load.py", line 114, in full_load
    col("global.straight_distance") >= args.radius_1 &
  File "/usr/local/spark/python/lib/pyspark.zip/pyspark/sql/column.py", line 635, in __nonzero__
ValueError: Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions.

为什么 spark 无法识别我的状况,我应该如何纠正?

【问题讨论】:

    标签: python apache-spark pyspark apache-spark-2.0


    【解决方案1】:

    尝试将每个条件语句放在括号内

    join_cond = [
        ((col("ltmr1.anc_ref") == col("global.anc_ref")) &
         (col("global.straight_distance") >= args.radius_1) &
         (col("global.straight_distance") <= args.radius_2))
    ]
    

    【讨论】:

      【解决方案2】:

      以下是预期的输出:

      join_cond = [
          col("ltmr1.anc_ref") == col("global.anc_ref"),
          col("global.distance") >= args.radius_1,
          col("global.distance") <= args.radius_2
      ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-29
        相关资源
        最近更新 更多