如何从火花数据框中提取 csv 名称

Posted

技术标签:

【中文标题】如何从火花数据框中提取 csv 名称【英文标题】:How to extract csv name from a spark dataframe 【发布时间】:2019-06-27 11:27:39 【问题描述】:

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

df = spark.read.csv("directory/name_file.csv")

现在我需要一种方法来提取“name_file”,而无需手动复制和粘贴。换句话说,我想要一个只包含字符串“name_file”的火花列表或数据框。

请仅提供涉及 PySpark SQL 或与 PySpark 兼容的 Python 代码的解决方案。

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

【问题讨论】:

你好,你试过什么?您可以使用basename 获取name_file.csv 部分,然后您可以使用splitext 删除扩展名 也许这篇文章会有所帮助:***.com/questions/39868263/… 为什么不用name_file 创建变量filename,然后在"directory/.csv".format(filename) 和任何其他地方使用它。 感谢 Tomasz 和 Reportgunner,使用链接的答案我能够提取所有目录。现在的问题是我只保留文件名,但 PySpark 不允许我将 basename 函数与该代码结合起来。你对此有什么想法吗? 【参考方案1】:

有一个功能: input_file_name 那么,你split

from pyspark.sql import functions as F

df = df.withColumn("path", F.input_file_name())
df = df.withColumn("path_splitted", F.split("path","/"))
df = df.withColumn("name", F.col("path_splitted").getItem(F.size("path_splitted")-1))

df.show()
+---+--------------+--------+----------------+
| id|          path|    name|   path_splitted|
+---+--------------+--------+----------------+
|  1|/foo/bar.csv  |bar.csv |[, foo, bar.csv]|
+---+--------------+--------+----------------+



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

F.reverse("path_splitted").getItem(0)

【讨论】:

正如我在上面评论的那样,实际上“input_file_name”函数并没有解决问题,因为它给了我整个目录,而我只需要最后一个斜杠“/”之后可以找到的文件名.你知道如何解决这个问题吗? 这太棒了。我已经了解了拆分功能的需求,但我不知道如何使用 getItem、size 和 reverse 来解决问题。非常感谢。【参考方案2】:

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

df = df.withColumn("filename", F.element_at(F.split(F.input_file_name(), "/"),-1))

或者如果您对父目录名感兴趣

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

【讨论】:

以上是关于如何从火花数据框中提取 csv 名称的主要内容,如果未能解决你的问题,请参考以下文章

如何从带有火花的数据框中找到最大长度的唯一行?

读入火花数据框时如何从csv文件中删除列

如何将火花日志文件转换为一个 CSV 文件

如何从报表上的选定文本框中提取文本? VBA

如何在火花中将数据帧转换为csv [重复]

R - 如何使用 sparklyr 复制火花数据框中的行