合并月份和年份列以创建日期列

Combine month and year columns to create date column

我有一个 pyspark 数据框:

Location    Month   Year
USA         1       2020
USA         1       2021
CAN         1       2020
CAN         2       2020
CAN         1       2021
CAN         2       2021

我需要合并月份和年份列来创建日期列。 我预期的数据框应该是:

Location    Month   Year    Date
USA         1       2020    1/1/2020
USA         1       2021    1/1/2021    
CAN         1       2020    1/1/2020
CAN         2       2020    2/1/2020
CAN         1       2021    1/1/2021
CAN         2       2021    2/1/2021

所有日期都应该从每个月的 1 号开始。 我试过这段代码:

df = df.select(concat_ws('/',df.month,1,df.year).alias('Month') \
                  ,df["*"])

并出现此错误:

Invalid argument, not a string or column

月份和年份列都是长数据类型

您也可以使用 withColumnconcat

示例:

from pyspark.sql import SparkSession
import pyspark.sql.functions as F

spark = SparkSession.builder.getOrCreate()
data = [
    {"Location": "USA", "Month": 1, "Year": 2020},
    {"Location": "USA", "Month": 2, "Year": 2020},
]
df = spark.createDataFrame(data=data)
df = df.withColumn(
    "Date", F.concat(F.col("Month"), F.lit("/"), F.lit("1"), F.lit("/"), F.col("Year"))
)

结果:

root
 |-- Location: string (nullable = true)
 |-- Month: long (nullable = true)
 |-- Year: long (nullable = true)
 |-- Date: string (nullable = true)

+--------+-----+----+--------+                                                  
|Location|Month|Year|Date    |
+--------+-----+----+--------+
|USA     |1    |2020|1/1/2020|
|USA     |2    |2020|2/1/2020|
+--------+-----+----+--------+

你得到 Invalid argument, not a string or column 因为你的 concat_ws('/', df.month, 1, df.year) 中的参数 1 既不是列也不是字符串(字符串应该是列的名称)。您可以使用 lit 内置函数更正它,如下所示:

from pyspark.sql import functions as F

df = df.select(F.concat_ws('/', df.month, F.lit(1), df.year).alias('Month'), df["*"])

或使用 make_date 函数(自 Spark 3 起可用):

import pyspark.sql.functions as F

df1 = df.withColumn(
    "Date",
    F.date_format(F.expr("make_date(Year, Month, 1)"), "MM/dd/yyyy")
)