我有一列包含字串陣列,例如:
["test.a" "random.ac"]
["test.41" "random.23" "test.123"]
我只想獲取“。”之前的文本。我只為陣列的第一個元素這樣做。我如何對所有元素執行此操作?最好沒有UDF。
df = df.withColumn("address", substring_index(col("all_addresses").getItem(0), ".", 1)))
uj5u.com熱心網友回復:
我會使用與@wwnde 類似的想法 -transform函式。transform接受一個陣列,根據提供的函式轉換它的每個元素,并產生相同大小的陣列,但元素發生了變化。正是你需要的。
但是,具有相同的原始想法,我可能會以不同的方式實作它。
2個選項:
from pyspark.sql import functions as F
df = spark.createDataFrame(
[(["test.a", "random.ac"],),
(["test.41", "random.23", "test.123"],)],
['c1']
)
df = df.withColumn('c2', F.transform('c1', lambda x: F.element_at(F.split(x, '\.'), 1)))
df = df.withColumn('c3', F.transform('c1', lambda x: F.regexp_extract(x, r'(. )\.', 1)))
df.show()
# -------------------- -------------------- --------------------
# | c1| c2| c3|
# -------------------- -------------------- --------------------
# | [test.a, random.ac]| [test, random]| [test, random]|
# |[test.41, random....|[test, random, test]|[test, random, test]|
# -------------------- -------------------- --------------------
uj5u.com熱心網友回復:
使用 regexp_extract。alphanumerics如果僅后跟特殊字符,則額外匹配.
--- ------------------------------
|id |text |
--- ------------------------------
|1 |[test.a, random.ac] |
|2 |[test.41, random.23, test.123]|
--- ------------------------------
df.withColumn('new', expr("transform(text,x->regexp_extract(x,'[a-z0-9] (?=\.)',0))")).show()
--- -------------------- --------------------
| id| text| new|
--- -------------------- --------------------
| 1| [test.a, random.ac]| [test, random]|
| 2|[test.41, random....|[test, random, test]|
--- -------------------- --------------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/488040.html
