合并月份和年份列以创建日期列
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
月份和年份列都是长数据类型
您也可以使用 withColumn
和 concat
。
示例:
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")
)
我有一个 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
月份和年份列都是长数据类型
您也可以使用 withColumn
和 concat
。
示例:
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")
)