【问题标题】:Split file name into different columns of pyspark dataframe将文件名拆分为 pyspark 数据框的不同列
【发布时间】:2020-08-13 05:32:39
【问题描述】:

我正在使用 pyspark SQL 函数 input_file_name 将输入文件名添加为数据框列。

df = df.withColumn("filename",input_file_name())

该列现在具有如下值。 "abc://dev/folder1/date=20200813/id=1"

从上面的列中,我必须创建 2 个不同的列。

  1. 日期
  2. 身份证

我只需要从上述文件名中获取日期和 ID 并将其填充到上述列中。

我可以使用 split_col 并得到它。但是如果文件夹结构发生变化,那可能是个问题。

有没有办法检查文件名是否包含字符串“date”和“id”,并获取等于符号后的值并填充两个新列?

下面是预期的输出。

filename                             date     id
abc://dev/folder1/date=20200813/id=1 20200813 1

【问题讨论】:

  • 我没有使用 Spark 的经验,只是好奇,你为什么不能在字符串中做 'date' 而在字符串中做 'id'?

标签: python apache-spark pyspark hdfs


【解决方案1】:

您可以将regexp_extract 与查看date=id= 子字符串的模式一起使用:

df = sc.parallelize(['abc://dev/folder1/date=20200813/id=1', 
                     'def://dev/folder25/id=3/date=20200814'])\
       .map(lambda l: Row(file=l)).toDF()
+-------------------------------------+
|file                                 |
+-------------------------------------+
|abc://dev/folder1/date=20200813/id=1 |
|def://dev/folder25/id=3/date=20200814|
+-------------------------------------+
df = df.withColumn('date', f.regexp_extract(f.col('file'), '(?<=date=)[0-9]+', 0))\
       .withColumn('id', f.regexp_extract(f.col('file'), '(?<=id=)[0-9]+', 0))
df.show(truncate=False)

哪些输出:

+-------------------------------------+--------+---+
|file                                 |date    |id |
+-------------------------------------+--------+---+
|abc://dev/folder1/date=20200813/id=1 |20200813|1  |
|def://dev/folder25/id=3/date=20200814|20200814|3  |
+-------------------------------------+--------+---+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2019-04-03
    • 2017-11-15
    • 1970-01-01
    相关资源
    最近更新 更多