【问题标题】:Split string column by backslash通过反斜杠拆分字符串列
【发布时间】:2021-06-02 02:31:33
【问题描述】:

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

Id path
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 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

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

【问题讨论】:

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


    【解决方案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  |
    +---+-----------------------------------------------------------+-----------+
    

    【讨论】:

      【解决方案2】:

      需要四个反斜杠,因为每个级别的解析都需要重复转义(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  |
      +---+-----------------------------------------------------------+-----------+
      

      【讨论】:

        猜你喜欢
        • 2020-12-25
        • 1970-01-01
        • 1970-01-01
        • 2012-10-23
        • 2023-02-02
        • 1970-01-01
        • 2022-12-19
        • 1970-01-01
        相关资源
        最近更新 更多