【问题标题】:Change a pyspark column based on the value of another column根据另一列的值更改 pyspark 列
【发布时间】:2017-11-18 20:24:02
【问题描述】:

我有一个名为 df 的 pyspark 数据框。

ONE LINE EXAMPLE:

df.take(1)
[Row(data=u'2016-12-25',nome=u'Mauro',day_type="SUN")]

我有一个假期清单:

holydays=[u'2016-12-25',u'2016-12-08'....]

如果“数据”在神圣日列表中,我想将 day_type 切换为“HOLIDAY”,否则我想保留 day_type 字段。

这是我的非工作暂定:

df=df.withColumn("day_type",when(col("data") in holydays, "HOLIDAY").otherwise(col("day_type")))

PySpark 不喜欢“在圣日”这个表达。 它返回此错误:

ValueError: Cannot convert column into bool: please use '&' for 'and', '|' 

【问题讨论】:

    标签: pyspark apache-spark-sql spark-dataframe pyspark-sql


    【解决方案1】:

    关于你的第一个问题 - 你需要isin:

    spark.version
    # u'2.2.0'
    
    from pyspark.sql import Row
    from pyspark.sql.functions import col, when
    
    df=spark.createDataFrame([Row(data=u'2016-12-25',nome=u'Mauro',day_type="SUN")])
    
    holydays=[u'2016-12-25',u'2016-12-08']
    
    df.withColumn("day_type",when(col("data").isin(holydays), "HOLIDAY").otherwise(col("day_type"))).show()
    # +----------+--------+-----+
    # |      data|day_type| nome|
    # +----------+--------+-----+
    # |2016-12-25| HOLIDAY|Mauro|
    # +----------+--------+-----+
    

    关于您的第二个问题 - 我没有发现任何问题:

    df.withColumn("day_type",when(col("data")=='2016-12-25', "HOLIDAY").otherwise(col("day_type"))).filter("day_type='HOLIDAY'").show()
    # +----------+--------+-----+ 
    # |      data|day_type| nome| 
    # +----------+--------+-----+
    # |2016-12-25| HOLIDAY|Mauro|
    # +----------+--------+-----+
    

    顺便说一句,提供多一点的样本数据总是一个好主意...

    【讨论】:

      【解决方案2】:

      在列上使用 isin 函数而不是使用 in 子句来检查值是否存在于列表中。示例代码:

      df=df.withColumn("day_type",when(df.data.isin(holydays), "HOLIDAY").otherwise(df.day_type)))
      

      【讨论】:

        猜你喜欢
        • 2021-09-05
        • 1970-01-01
        • 1970-01-01
        • 2016-01-23
        • 2022-12-16
        • 1970-01-01
        • 2018-04-15
        • 2012-10-15
        • 1970-01-01
        相关资源
        最近更新 更多