根据另一列的值更改pyspark列

时间:2017-11-18 11:15:48

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

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

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

我有一个假期日列表:

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

我想将day_type切换为" HOLIDAY"如果"数据"是在holydays列表中,否则我想保留day_type字段。

这是我的非工作暂定:

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

PySpark不喜欢讽刺作品中的表达""。 它返回此错误:

{{1}}

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

关于您的第一个问题 - 您需要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|
# +----------+--------+-----+
顺便说一下,提供一行不止一行的样本数据总是一个好主意...