我在 myTable 中有此列:
| 我的專欄 |
|---|
| [紅、綠] |
| 【綠、綠、紅】 |
我需要修改它,以便我可以用 1 替換紅色,用 2 替換綠色:
| 我的專欄 |
|---|
| [1, 2] |
| [2, 2, 1] |
簡而言之,有沒有辦法對陣列中的每個元素逐行應用 case 子句?
到目前為止我得到的最接近的:
select replace(replace(to_json(myColumn), 'red', 1), 'green', 2)
另一方面,如果我們有一列字串,我可以簡單地使用:
select (
case
when myColumn='red' then 1
when myColumn='green' then 2
end
) from myTable;
uj5u.com熱心網友回復:
假設 dataframe 已經注冊了一個名為 的臨時視圖tmp,使用下面的 SQL 陳述句來獲取結果。
sql = """
select
collect_list(
case col
when 'red' then 1
when 'green' then 2
end)
myColumn
from
(select mid,explode(myColumn) col
from
(select monotonically_increasing_id() mid,myColumn
from tmp)
)
group by mid
"""
df = spark.sql(sql)
df.show(truncate=False)
uj5u.com熱心網友回復:
在純 Spark SQL 中,您可以使用 將陣列轉換為字串concat_ws,進行替換,regexp_replace然后使用 重新創建陣列split。
select split(
regexp_replace(
regexp_replace(
concat_ws(',', myColumn)
, 'red', '1')
, 'green', '2')
, ',') myColumn from df
uj5u.com熱心網友回復:
讓我們創建一些示例資料和一個包含替換的地圖:tou want to make
val df = Seq((1, Seq("red", "green")),
(2, Seq("green", "green", "red")))
.toDF("id", "myColumn")
val values = Map("red" -> "1", "green" -> "2")
最直接的方法是定義一個完全符合您要求的 UDF:
val replace = udf((x : Array[String]) =>
x.map(value => values.getOrElse(value, value)))
df.withColumn("myColumn", replace('myColumn)).show
--- ---------
| id| myColumn|
--- ---------
| 1| [1, 2]|
| 2|[2, 2, 1]|
--- ---------
如果沒有 UDF,您可以concat_ws使用不在您的陣列中的分隔符將陣列轉換為字串。然后我們可以使用字串函式進行編輯:
val sep = ","
val replace = values
.foldLeft(col("myColumn")){ case (column, (key, value)) =>
regexp_replace(column, sep key sep, sep value sep)
}
df.withColumn("myColumn", concat(lit(sep), concat_ws(sep sep, 'myColumn), lit(sep)))
.withColumn("myColumn", regexp_replace(replace, "(^,)|(,$)", ""))
.withColumn("myColumn", split('myColumn, sep sep))
.show
uj5u.com熱心網友回復:
我可以執行一個簡單的轉換(Spark 3 起)
select transform(myColumn, value ->
case value
when 'red' then 1
when 'green' then 2
end
from myTable
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/345644.html
