我确信这是一个简单的更改,但只是将日期列与项目列表匹配就有问题。例如使用假期包,但问题可以应用于其他用例,只是我在PySpark的经验不是很好!!
使用holidays包(https://pypi.org/project/holidays/),我检索假期的字典
nyse_holidays=holidays.financial.ny_stock_exchange.NewYorkStockExchange(years=2018)
print(nyse_holidays)
字符串
- {datetime.date(2018,12,5):'Day of President乔治H.W. Bush',datetime.date(2018,1,1):“New Year's Day”,datetime.date(2018,1,15):'Martin Luther King Jr. Day',datetime.date(2018,2,19):“华盛顿的生日”,datetime.date(2018,3,30):'Good Friday',datetime.date(2018,5,28):'Memorial Day',datetime.date(2018,7,4):'Independence Day',datetime.date(2018,9,3):'Labor Day',datetime.date(2018,11,22):'Thanksgiving Day',datetime.date(2018,12,25):圣诞节
我还有另一个Spark Dataframe ,其模式如下
root
|-- id: long (nullable = false)
|-- date: timestamp (nullable = false)
|-- year: integer (nullable = false)
|-- month: integer (nullable = false)
|-- day: string (nullable = false)
|-- day_of_year: string (nullable = false)
|-- hour: string (nullable = false)
|-- minute: string (nullable = false)
|-- is_weekend: boolean (nullable = false)
|-- only_date: date (nullable = false)
型
我只是想添加另一个字段,说明该行的日期是否为假日
下面的代码从不匹配任何日期
from pyspark.sql.functions import col, create_map, lit
from itertools import chain
mapping_expr = create_map([lit(x) for x in chain(*nyse_holidays.items())])
#search_date
display(df.withColumn("value", mapping_expr["only_date"]).filter(col("value").isNotNull()))
型
如果我将代码更改为一个固定值以检查mapping_expr是否工作,那么它就可以正常工作。
search_date = datetime.strptime('2018-01-01', '%Y-%m-%d')
display(df.withColumn("value", mapping_expr[search_date]).filter(col("value").isNotNull()))
型
当然,代码只会使用'date'字段,但我想我会创建一个only_date字段。
任何建议,当然我只是错过了一些愚蠢的东西。假设它的转换字段被过去到mapping_expr
1条答案
按热度按时间6ioyuze21#
简单到只需要在Map表达式中传入col(“only_date”)。
长时间的其他事情!头脑不集中,给予我c#!:)