我有一個 pyspark 資料框:
Location Month Year
USA 1 2020
USA 1 2021
CAN 1 2020
CAN 2 2020
CAN 1 2021
CAN 2 2021
我需要結合 Month 和 Year 列來創建 Date 列。我預期的資料框應該是:
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["*"])
并收到此錯誤:
無效引數,不是字串或列
Month 和 Year 列都是 long 資料型別
uj5u.com熱心網友回復:
你得到的Invalid argument, not a string or column,因為爭論1在你concat_ws('/', df.month, 1, df.year)既不是一列或字串(字串應該是列名)。您可以使用lit內置函式對其進行更正,如下所示:
from pyspark.sql import functions as F
df = df.select(F.concat_ws('/', df.month, F.lit(1), df.year).alias('Month'), df["*"])
uj5u.com熱心網友回復:
您也可以使用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|
-------- ----- ---- --------
uj5u.com熱心網友回復:
或使用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")
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/364796.html
標籤:Python 阿帕奇火花 火花 apache-spark-sql
下一篇:本地Spark配置
