使用 PySpark,我需要將單個資料框列決議為兩列。
輸入資料:
| 檔案名 |
|---|
| /level1/level2/level3/file1.ext |
| /level1/file1000.ext |
| /level1/level2/file20.ext |
輸出:
| 檔案名 | 小路 |
|---|---|
| 檔案1.ext | /level1/level2/level3/ |
| 檔案 1000.ext | /1級/ |
| 檔案20.ext | /level1/level2/ |
我知道我可以使用帶有硬編碼位置的子字串,但這不是硬編碼的好例子,因為檔案名值的長度可能會因行而異,如示例所示。
但是,我知道我需要在最后一個斜杠 (/) 之后斷開輸入字串。這是一條有助于避免硬編碼拆分輸入字串的特定位置的規則。
uj5u.com熱心網友回復:
有幾種方法可以使用正則運算式函式或 split 方法。
from pyspark.sql.functions import split, element_at, regexp_extract
df \
.withColumn("file_name", element_at(split("raw", "/"), -1) ) \
.withColumn("file_name2", regexp_extract("raw", "(?<=/)[^/] $", 0)) \
.withColumn("path", regexp_extract("raw", "^.*/", 0)) \
.show(truncate=False)
------------------------------- ------------ ------------ ----------------------
|raw |file_name |file_name2 |path |
------------------------------- ------------ ------------ ----------------------
|/level1/level2/level3/file1.ext|file1.ext |file1.ext |/level1/level2/level3/|
|/level1/file1000.ext |file1000.ext|file1000.ext|/level1/ |
|/level1/level2/file20.ext |file20.ext |file20.ext |/level1/level2/ |
------------------------------- ------------ ------------ ----------------------
uj5u.com熱心網友回復:
其他幾個選項:
from pyspark.sql import functions as F
df=spark.createDataFrame(
[('/level1/level2/level3/file1.ext',),
('/level1/file1000.ext',),
('/level1/level2/file20.ext',)],
['file_name']
)
df = df.withColumn('file', F.substring_index('file_name', '/', -1))
df = df.withColumn('path', F.expr('left(file_name, length(file_name) - length(file))'))
df.show(truncate=0)
# ------------------------------- ------------ ----------------------
# |file_name |file |path |
# ------------------------------- ------------ ----------------------
# |/level1/level2/level3/file1.ext|file1.ext |/level1/level2/level3/|
# |/level1/file1000.ext |file1000.ext|/level1/ |
# |/level1/level2/file20.ext |file20.ext |/level1/level2/ |
# ------------------------------- ------------ ----------------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/488049.html
