spark.sql("select case when length(regexp_replace(date,'[^0-9]', ''))==8 then regexp_replace(date,'[^0-9]', '') else regexp_replace(date,'[^0-9]','') end as date from input").show(false)
在上面我需要添加要求,例如,
1. 輸出應yyyymmdd使用 unix_timestamp以“ ”格式進行驗證。
- 如果它無效,則應通過將前四 (4) 個字符移動到提取的數字字串 (
MMDDYYYY to YYYYMMDD)的末尾來轉換提取的數字字串,然后應使用 'yyyymmdd' 格式進行驗證,如果滿足此條件,則列印日期。
我不確定如何在我的查詢中包含 Unix 時間戳。
示例輸入和輸出 1:
input: 2021dgsth02hdg02
output: 20210202
示例輸入和輸出 2:
input: 0101def20dr21 (note: MMDDYYYY TO YYYYMMDD)
output: 20210101
使用 unix_timestamp 代替 to_date
spark.sql("select (case when length(regexp_replace(date,'[^0-9]', ''))==8 then CASE WHEN from_unixtime(unix_timestamp(regexp_replace(date,'[a-zA-Z] ',''),'yyyyMMdd') ,'yyyyMMdd') IS NULL THEN from_unixtime(unix_timestamp(regexp_replace(date,'[a-zA-Z] ',''),'MMddyyyy') ,'MMddyyyy') ELSE from_unixtime(unix_timestamp(regexp_replace(date,'[a-zA-Z] ',''),'yyyyMMdd') ,'yyyyMMdd') END else regexp_replace(date,'[^0-9]','') end ) AS dt from input").show(false)
uj5u.com熱心網友回復:
試試下面的代碼。
scala> val df = Seq("2021dgsth02hdg02","0101def20dr21").toDF("dt")
df: org.apache.spark.sql.DataFrame = [dt: string]
scala> df.show(false)
----------------
|dt |
----------------
|2021dgsth02hdg02|
|0101def20dr21 |
----------------
scala> df
.withColumn("dt",regexp_replace($"dt","[a-zA-Z] ",""))
.withColumn("dt",
when(
to_date($"dt","yyyyMMdd").isNull,
to_date($"dt","MMddyyyy")
)
.otherwise(to_date($"dt","yyyyMMdd"))
).show(false)
----------
|dt |
----------
|2021-02-02|
|2021-01-01|
----------
// Entering paste mode (ctrl-D to finish)
spark.sql("""
select (
CASE WHEN to_date(regexp_replace(date,'[a-zA-Z] ',''),'yyyyMMdd') IS NULL
THEN to_date(regexp_replace(date,'[a-zA-Z] ',''),'MMddyyyy')
ELSE to_date(regexp_replace(date,'[a-zA-Z] ',''),'yyyyMMdd')
END
) AS dt from input
""")
.show(false)
// Exiting paste mode, now interpreting.
----------
|dt |
----------
|2021-02-02|
|2021-01-01|
----------
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/334501.html
標籤:sql 数据框 阿帕奇火花 apache-spark-sql
上一篇:Terraform匯入地圖資源
