我使用 pyspark 作为代码语言。我添加了列来获取带有路径的文件名。
from pyspark.sql.functions import input_file_name
data = data.withColumn("sourcefile",input_file_name())
我只想从此列中检索文件名及其父文件夹。请帮忙。
示例:
Inputfilename = "adl://dotdot.com/ingest/marketing/abc.json"
我正在寻找的输出是:
marketing/abc.json
注意:字符串操作我可以做。文件路径列是数据框的一部分。
如果您想将值保留在数据帧列中,您可以使用 pyspark.sql.function regexp_extract。您可以将其应用到具有路径值的列并传递提取所需部分所需的正则表达式:
data = data.withColumn("sourcefile",input_file_name())
regex_str = "[\/]([^\/]+[\/][^\/]+)$"
data = data.withColumn("sourcefile", regexp_extract("sourcefile",regex_str,1))
我认为您正在寻找的是:
sc.wholeTextFiles('path/to/files').map(
lambda x : ( '/'.join(x[0].split('/')[-2:]), x[1])
)
这将创建一个包含 2 列的 rdd,第一个是
path to file
,第二个是文件的内容。这是在 Spark 中链接路径和内容的唯一方法。
例如,Hive 中存在其他方法。
使用 Spark 3.3.2、delta_spark 2.3.0 和 delta-parquet 文件时,input_file_name() 函数无法可靠地工作;相反,以下似乎效果更好:
regex_str = "[\/]([^\/]+[\/][^\/]+)$"
data = data.withColumn("sourcefile", regexp_extract("_metadata.file_path",regex_str,1))
另外,根据此 input_file_name 已弃用:https://docs.databricks.com/en/sql/language-manual/functions/input_file_name.html
在 Databricks SQL 和 Databricks Runtime 13.1 及更高版本中,此函数已弃用。请使用_metadata.file_name。