Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过比较同一数据帧中两个不同列之间的数据,在pyspark数据帧中填充一列_Python_Apache Spark_Pyspark_Apache Spark Sql - Fatal编程技术网

Python 通过比较同一数据帧中两个不同列之间的数据,在pyspark数据帧中填充一列

Python 通过比较同一数据帧中两个不同列之间的数据,在pyspark数据帧中填充一列,python,apache-spark,pyspark,apache-spark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,目的:实现此查询 选择*, 新建时的情况!=x或新y!=然后“某些状态更改”,否则cdc状态结束为cdc状态 来自数据帧,其中cdc_状态='noUpdateRequired' 我正在尝试使用pyspark(3.0.0)和spark(2.4.4)实现这个逻辑,目前我有这个 df = df.withColumn("cdc_status", F.when(((F.col('cdc_status') == 'noUpdateR

目的:实现此查询

选择*,
新建时的情况!=x或新y!=然后“某些状态更改”,否则cdc状态结束为cdc状态
来自数据帧,其中cdc_状态='noUpdateRequired'
我正在尝试使用pyspark(3.0.0)和spark(2.4.4)实现这个逻辑,目前我有这个

df = df.withColumn("cdc_status",
                           F.when(((F.col('cdc_status') == 'noUpdateRequired')
                                  & (F.col('new_autoapproveind') != F.col('autoapproveind')
                                  | F.col('new_preferpathway') != F.col('preferpathway'))), 'pathwayChange'))
但这让我犯了以下错误

ValueError: Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions
因此,基本上我需要一个能够更新列
cdc\u status
,其中
new\u x!=x或新y!=y,其中cdc_状态='noUpdateRequired'

df.printSchema()

root

 |-- new_autoapproveind: string (nullable = true)
 |-- new_preferpathway: string (nullable = true)
 |-- autoapproveind: string (nullable = true)
 |-- preferpathway: string (nullable = true)
 |-- cdc_status: string (nullable = true)
我在打印模式时删除了一些列,因为它们本质上是敏感的,但本质上它们也是基于字符串的列

我试着到处搜索,但在
pyspark
中找不到相同的解决方案<代码>scala具有
==运算符,但不存在相同的
pyspark

虽然我可以在其他情况下使用
when
函数,但它是
F.col('cdc_status')!='一些值“)
其中它是一个静态值,但这里我需要比较列之间的值,然后填充/更新
cdc\u status
列中的值


任何帮助都将不胜感激

您的条件中缺少括号,这导致了错误。也就是说,您的Python代码可能与SQL查询不同。您应该在添加新列之前进行筛选,还应该添加
否则
子句。e、 g

import pyspark.sql.functions as F

df2 = df.filter("cdc_status = 'noUpdateRequired'").withColumn(
    'cdc_status',
    F.when(
        (F.col('new_autoapproveind') != F.col('autoapproveind'))
        | 
        (F.col('new_preferpathway') != F.col('preferpathway')),
        'some_status_change'
    ).otherwise(
        F.col('cdc_status')
    )
)