首页 > 解决方案 > 如何将 csv 的目录作为镶木地板加载到 hdfs

问题描述

我在 linux 上有一个包含数千个 CSV 文件的本地文件夹。

每个 csv 文件约为 1mb。

这些文件共享相同的列/格式,并通过文件名本身来区分(即 xxx_1.csv、xxx_2.csv、xxx_3、csv 等)

现在,我想将目录加载到 HDFS 中,并以 parquet 格式保存。

在 python (spark 2.3) 中正确的方法是什么?

  1. 加载整个目录的最佳方法是什么?
  2. 我应该使用什么分区?(文件名应该是分区吗?还是将文件名添加为新列更好?)

谢谢

标签: csvapache-sparkpysparkhdfsparquet

解决方案


Spark 已经读取了整个目录,并且可以在 Parquet 中写出整个数据帧

df = spark.read.csv("file:///local_csv_dir")
df.write.parquet("hdfs:///other/dir")

read.csv 甚至可以访问文件名,所以我认为您不能通过这种方式进行分区。

withColumn您可以使用和函数添加文件名input_file_name,但是,理想情况下,您最好在数据中具有低基数(很少有唯一值)的字段上进行分区

一个可以说是“更好”的方法是将所有 CSV 文件放入一个大型 BZ2 存档中,然后将其放在 HDFS 上。然后,您可以在 Hadoop 中并行读取该文件,并写入不同格式或直接处理它


推荐阅读