通过反斜杠拆分字符串列

时间:2021-06-02 02:31:33

标签: dataframe apache-spark pyspark split apache-spark-sql

在带有包含路径和文件名的字符串列的数据框中(分隔符是反斜杠),我试图将其拆分并获取作为新列的文件名的最后一项。我使用的这段代码如下:

<头>
Id 路径
1 C:\Program Files\Notepad++\notepad.exe
2 C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
3 C:\Windows\SysWOW64\cmd.exe
4 C:\Program Files\Microsoft Office\root\Office16\WINWORD.EXE
5 C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE
df = df.withColumn("filename", f.split(f.col("path"), "\\").getItem(-1))

预期输出:

<头>
Id 路径 文件名
1 C:\Program Files\Notepad++\notepad.exe 记事本.exe
2 C:\Program Files (x86)\Google\Chrome\Application\chrome.exe chrome.exe
3 C:\Windows\SysWOW64\cmd.exe cmd.exe
4 C:\Program Files\Microsoft Office\root\Office16\WINWORD.EXE WINWORD.EXE
5 C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE EXCEL

但是,我在 Pyspark 中遇到运行时错误。我最初的猜测是用数据中的双反斜杠替换所有反斜杠,但这没有任何区别。感谢您对解决此问题的任何帮助。

2 个答案:

答案 0 :(得分:1)

使用正则表达式提取。提取 alphanumerics.alphanumerics 和字符串结尾之间的值 \

  df=df.withColumn('filename',  regexp_extract(col('path'), '((?<=\\\)\w+\.\w+(?=$))', 1))



+---+-----------------------------------------------------------+-----------+
|Id |path                                                       |filename   |
+---+-----------------------------------------------------------+-----------+
|1  |C:\Program Files\Notepad++\notepad.exe                     |notepad.exe|
|2  |C:\Program Files (x86)\Google\Chrome\Application\chrome.exe|chrome.exe |
|3  |C:\Windows\SysWOW64\cmd.exe                                |cmd.exe    |
|4  |C:\Program Files\Microsoft Office\root\Office16\WINWORD.EXE|WINWORD.EXE|
|5  |C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE  |EXCEL.EXE  |
+---+-----------------------------------------------------------+-----------+

答案 1 :(得分:1)

需要四个反斜杠,因为每个级别的解析都需要重复转义(Python 然后是 Spark):

df.withColumn("filename", f.element_at(f.split(f.col("path"), "\\\\"), -1)).show(truncate=False)
+---+-----------------------------------------------------------+-----------+
|Id |path                                                       |filename   |
+---+-----------------------------------------------------------+-----------+
|1  |C:\Program Files\Notepad++\notepad.exe                     |notepad.exe|
|2  |C:\Program Files (x86)\Google\Chrome\Application\chrome.exe|chrome.exe |
|3  |C:\Windows\SysWOW64\cmd.exe                                |cmd.exe    |
|4  |C:\Program Files\Microsoft Office\root\Office16\WINWORD.EXE|WINWORD.EXE|
|5  |C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE  |EXCEL.EXE  |
+---+-----------------------------------------------------------+-----------+