Логическое условие Xor в pyspark - PullRequest
1 голос
/ 18 июня 2020

Есть ли в pyspark логическое выражение XOR? В документации здесь указано использовать ^, но я получаю следующую ошибку, когда пытаюсь это сделать.

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Ничто в этой ссылке не указывает, что вы должны использовать ^, вхождение в шкаф выглядит следующим образом:

>>> from pyspark.sql import Row
>>> df = spark.createDataFrame([Row(a=170, b=75)])
>>> df.select(df.a.bitwiseXOR(df.b)).collect()
[Row((a ^ b)=225)]

Другие вхождения ^ используются для обоих регулярных выражений и экспоненты не связаны.

Этот конкретный случай показывает результат с символом ^ в нем, но он очень говорит вам использовать bitwiseXOR(). Однако существует большая разница между побитовыми и логическими операциями or (если, конечно, они не применяются только для битовых значений, равных нулю и единице в среде, которая объединяет эти два).

логические "на этой странице не имеют ничего общего с логическими операторами, операция, похоже, недоступна.

1 голос
/ 18 июня 2020

Логические операции с объектами pyspark.sql.column.Column, позволяющие использовать &, | и ~, определены здесь . Как видите, к сожалению, операция XOR не входит в число определенных.

Таким образом:

df = spark.range(1000)
df.where((df.id >= 20) & (df.id <= 40)) # will be ok
df.where((df.id >= 20) ^ (df.id <= 40)) # will result in error

Однако вы можете написать что-то вроде этого:

df.where((df.id >= 10).cast('int')\
        .bitwiseXOR((df.id <= 90).cast('int')).cast('boolean')).show()

Если вы крайне недовольны отсутствием (df.id >= 20) ^ (df.id <= 40), вы можете использовать что-то вроде следующего на свой страх и риск (я не рекомендую это делать):

import pyspark
df = spark.range(50)
pyspark.sql.column.Column.__xor__ = lambda x, y: x.cast('int').bitwiseXOR(y.cast('int')).cast('boolean')
df.where((df.id >= 10) ^ (df.id <= 40)).show()
...