【问题标题】:pyspark read multiple csv files at oncepyspark 一次读取多个 csv 文件
【发布时间】:2021-11-19 20:06:36
【问题描述】:

我正在使用 SPARK 读取 hdfs 中的文件。有一个场景,我们从遗留系统中以 csv 格式获取文件作为块。

ID1_FILENAMEA_1.csv
ID1_FILENAMEA_2.csv
ID1_FILENAMEA_3.csv
ID1_FILENAMEA_4.csv
ID2_FILENAMEA_1.csv
ID2_FILENAMEA_2.csv
ID2_FILENAMEA_3.csv

这些文件使用 HiveWareHouse 连接器加载到 HIVE 中的 FILENAMEA,几乎没有添加默认值等转换。同样,我们有大约 70 张桌子。 Hive 表以 ORC 格式创建。表按 ID 分区。现在,我正在一一处理所有这些文件。这需要很多时间。

我想让这个过程更快。文件将以 GB 为单位。

有什么方法可以同时读取所有 FILENAMEA 文件并将其加载到 HIVE 表中。

【问题讨论】:

  • 您谈到了 70 个表,所有这些 CSV 文件是否具有相同的架构?所有文件都在同一个目录中吗?如果是,您是否必须读取此目录中的所有文件或仅读取其中一些文件?您可以发布您当前使用的代码(只有读写部分,而不是转换)?提前致谢!
  • @VincentDoba:感谢您的回复。每个表都有唯一的架构。是的,同一目录中的所有文件。我必须阅读所有文件。我正在使用 spark.read.csv(filename).toDF(columns)。

标签: apache-spark pyspark hive


【解决方案1】:

您有两种方法可以读取 pyspark 中的多个 CSV 文件。如果所有的 CSV 文件都在同一个目录中并且都具有相同的架构,则可以通过直接将目录的路径作为参数传递来一次读取,如下所示:

spark.read.csv('hdfs://path/to/directory')

如果您在不同位置有 CSV 文件或在同一目录中有 CSV 文件但其中包含其他 CSV/文本文件,您可以将它们作为字符串传递,表示 .csv() 方法参数中的路径列表,如下所示:

spark.read.csv('hdfs://path/to/filename1,hdfs://path/to/filename2')

您可以了解有关如何使用 Spark here 读取 CSV 文件的更多信息

如果您需要从 HDFS 目录中的文件列表构建此路径列表,您可以查看 this answer,一旦您创建了路径列表,您可以将其转换为字符串以传递给 @ 987654327@方法与','.join(your_file_list)

【讨论】:

  • 谢谢。有没有办法用通配符读取所有 csv 文件?像 spark.read.csv('hdfs://path/to/*FILENAMEA*')
  • 不,它不起作用,spark.read 只接受文字文件路径。您必须首先在普通 python 中列出并过滤您的文件列表,然后将其作为字符串作为参数传递给spark.read.csv()
  • 每个文件都以 GB 为单位。性能方面,继续下去会好吗?
  • 是的,性能方面,继续进行会很好。 Spark 专为此类用例而设计。
  • 每个表将有 500 个文件。处理文件的数量有限制吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 2022-01-19
  • 2017-04-29
  • 2019-02-10
  • 2022-06-13
  • 2022-01-19
相关资源
最近更新 更多