如何从火花数据框中提取 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 名称的主要内容,如果未能解决你的问题,请参考以下文章