【问题标题】:How to extract csv name from a spark dataframe如何从火花数据框中提取 csv 名称
【发布时间】: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 删除扩展名
  • 也许这篇文章会有所帮助:stackoverflow.com/questions/39868263/…
  • 为什么不用name_file 创建变量filename,然后在"directory/{}.csv".format(filename) 和任何其他地方使用它。
  • 感谢 Tomasz 和 Reportgunner,使用链接的答案我能够提取所有目录。现在的问题是我只保留文件名,但 PySpark 不允许我将 basename 函数与该代码结合起来。你对此有什么想法吗?

标签: python dataframe pyspark


【解决方案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))

【讨论】:

    猜你喜欢
    • 2021-06-07
    • 2019-03-19
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    相关资源
    最近更新 更多