Python 如何从spark数据框中提取csv名称

Python 如何从spark数据框中提取csv名称,python,dataframe,pyspark,Python,Dataframe,Pyspark,我们的背景是PySpark。假设我使用spark.read.csv函数创建一个数据帧df,即 df=spark.read.csv(“directory/name\u file.csv”) 现在我需要一种方法来提取“name_文件”,当然不用手动复制和粘贴。换句话说,我想要一个仅包含字符串“name\u file”的spark列表或数据帧 请仅提供包含PySpark SQL或与PySpark兼容的Python代码的解决方案 这个问题看起来很简单,但我花了很多时间寻找解决方案,却一无所获。有一个函数

我们的背景是PySpark。假设我使用spark.read.csv函数创建一个数据帧df,即

df=spark.read.csv(“directory/name\u file.csv”)

现在我需要一种方法来提取“name_文件”,当然不用手动复制和粘贴。换句话说,我想要一个仅包含字符串“name\u file”的spark列表或数据帧

请仅提供包含PySpark SQL或与PySpark兼容的Python代码的解决方案


这个问题看起来很简单,但我花了很多时间寻找解决方案,却一无所获。

有一个函数: 然后,您将
拆分

从pyspark.sql导入函数为F
df=df.withColumn(“路径”,F.input\u file\u name())
df=df.withColumn(“路径被拆分”,F.split(“路径“,“/”))
df=df.withColumn(“name”,F.col(“path_splitted”).getItem(F.size(“path_splitted”)-1))
df.show()
+---+--------------+--------+----------------+
|id |路径|名称|路径|已拆分|
+---+--------------+--------+----------------+
|1 |/foo/bar.csv | bar.csv |[,foo,bar.csv]|
+---+--------------+--------+----------------+

编辑: 使用spark 2.4,您可以使用
reverse
轻松获取最后一个元素


F.reverse(“path\u splitted”).getItem(0)

如果不想创建需要在之后删除的额外列,可以链接pyspark.sql.functions。我们还可以利用pyspark.sql.functions.element_at(Spark 2.4+),这为我们节省了一个操作(F.size)

或者如果你对这个名字感兴趣

df = df.withColumn("dirname", F.element_at(F.split(F.input_file_name(), "/"),-2))

你好,你试过什么?您可以使用获得
name_文件.csv
部分,然后使用删除扩展名。也许这篇文章会有所帮助:为什么不使用
name_文件创建变量
filename
,然后在
“directory/{}.csv.format(filename)
和其他任何地方使用它呢。感谢Tomasz和Reportgunner,使用链接的答案,我能够提取所有目录。现在的问题是,我只保留文件名,但PySpark不允许我将basename函数与该代码结合使用。你对此有什么想法吗?正如我在上面所评论的,实际上“input_file_name”函数并不能解决这个问题,因为它提供了整个目录,而我只需要在最后一个斜杠“/”之后可以找到的文件名。你知道怎么解决这个问题吗?这太可怕了。我已经理解了split函数的需要,但是我不知道如何使用getItem、size和reverse来解决这个问题。非常感谢你。
df = df.withColumn("dirname", F.element_at(F.split(F.input_file_name(), "/"),-2))