2017-11-18 151 views
1

我有一個名爲df的pyspark數據框。根據另一列的值更改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」如果「數據」是holydays列表,否則我要離開day_type領域,因爲它是。

這是我的非工作暫定:

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

PySpark不喜歡 「在holydays」 的表述。 它返回此錯誤:

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

回答

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| 
# +----------+--------+-----+ 

BTW,提供稍多於單行的樣本數據總是一個好主意......

1

使用ISIN功能上欄,而不是使用條款來檢查值出現在列表中。示例代碼:

df=df.withColumn("day_type",when(df.data.isin(holydays), "HOLIDAY").otherwise(df.day_type))) 
相關問題