[英]Split file name into different columns of pyspark dataframe
我正在使用 pyspark SQL function input_file_name 將輸入文件名添加為 Z6A5507DB3CDF47549。
df = df.withColumn("filename",input_file_name())
該列現在具有如下值。 “abc://dev/folder1/date=20200813/id=1”
從上面的列中,我必須創建 2 個不同的列。
我必須從上面的文件名中只獲取日期和 id 並將其填充到上面提到的列中。
我可以使用 split_col 並得到它。 但是,如果文件夾結構發生變化,則可能會出現問題。
有沒有辦法檢查文件名是否包含字符串“date”和“id”,並獲取等於符號之后的值並將其填充兩個新列?
下面是預期的 output。
filename date id
abc://dev/folder1/date=20200813/id=1 20200813 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 |
+-------------------------------------+--------+---+
我已經使用 withcolumn 和 split 通過將列值創建為同一數據集中的列來將列值分解為日期和 id,代碼片段如下:
from pyspark.sql.types import StructType,StructField, StringType, IntegerType
adata = [("abc://dev/folder1/date=20200813/id=1",)]
aschema = StructType([StructField("filename",StringType(),True)])
adf = spark.createDataFrame(data=adata,schema=aschema)
bdf = adf.withColumn('date', split(adf['filename'],'date=').getItem(1)[0:8]).withColumn('id',split(adf['filename'],'id=').getItem(1))
bdf.show(truncate=False)
輸出到:
+------------------------------------+--------+---+
|filename |date |id |
+------------------------------------+--------+---+
|abc://dev/folder1/date=20200813/id=1|20200813|1 |
+------------------------------------+--------+---+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.