使用 Pyspark,我正在使用一些日期時間資訊查詢資料庫:
df.select(df.Activity_date).show(5, truncate = False)
-------------------------
|Activity_date |
-------------------------
|Jul 20, 2015, 1:06:57 PM |
|Oct 11, 2015, 10:03:14 PM|
|Dec 8, 2016, 4:28:12 PM |
|Dec 12, 2016, 10:22:44 PM|
|Dec 25, 2016, 10:37:32 PM|
-------------------------
我想做一個提取月份的查詢,然后是年份。
事情是這樣的:
df.select( "Activity_Type",
regexp_extract("Activity_Date",r"^(\\w{3})",1).alias("Month"),
regexp_extract("Activity_Date", r"^\\d{4}$",1).alias("Year"),
).show(5,truncate=False)
------------- ----- ----
|Activity_Type|Month|Year|
------------- ----- ----
|Ride |Jul | |
|Ride |Oct | |
|Ride |Dec | |
|Ride |Dec | |
|Ride |Dec | |
------------- ----- ----
如您所見,我很難撰寫正則運算式來提取年份部分。
uj5u.com熱心網友回復:
您不需要在這里使用正則運算式。只需將字串日期轉換為時間戳,然后使用 Spark datetime 函式提取month和year:
from pyspark.sql import functions as F
df = spark.createDataFrame([
("Jul 20, 2015, 1:06:57 PM",), ("Oct 11, 2015, 10:03:14 PM",),
("Dec 8, 2016, 4:28:12 PM",), ("Dec 12, 2016, 10:22:44 PM",),
("Dec 25, 2016, 10:37:32 PM",)], ["Activity_date"])
df1 = (df.withColumn("Activity_date", F.to_timestamp("Activity_date", "MMM d, yyyy, h:mm:ss a"))
.withColumn("Month", F.date_format("Activity_date", "MMM"))
.withColumn("Year", F.year("Activity_date"))
)
df1.show()
# ------------------- ----- ----
#| Activity_date|Month|Year|
# ------------------- ----- ----
#|2015-07-20 13:06:57| Jul|2015|
#|2015-10-11 22:03:14| Oct|2015|
#|2016-12-08 16:28:12| Dec|2016|
#|2016-12-12 22:22:44| Dec|2016|
#|2016-12-25 22:37:32| Dec|2016|
# ------------------- ----- ----
uj5u.com熱心網友回復:
\w ?\s\d{1,2},\s(\d{4})此模式將年份提取到第一個捕獲組中。
https://regex101.com/r/Wo0dIm/1
uj5u.com熱心網友回復:
而且,在進一步嘗試的經典案例中,這是一個可能的答案:
df.select(
"Activity_Type",
regexp_extract("Activity_Date", r"^(\w{3})", 1).alias("Month"),
regexp_extract("Activity_Date", r"^\w{3}\s\d{1,2}(,)\s(.{4})",2).alias("Year"),
).show(5,truncate=False)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/453288.html
標籤:Python 正则表达式 阿帕奇火花 pyspark apache-spark-sql
