【问题标题】:How to load directory of csv to hdfs as parquet如何将 csv 的目录作为镶木地板加载到 hdfs
【发布时间】:2019-04-23 00:27:55
【问题描述】:

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

每个 csv 文件约为 1mb。

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

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

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

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

谢谢

【问题讨论】:

    标签: csv apache-spark pyspark hdfs parquet


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 您可以将文件名(使用 input_file_name() 方法)添加到 df.在这种情况下,如果我按文件名分区(我有数千个 CSV 文件),我将获得数千个文件夹。这样划分合乎逻辑吗?
    • 只有在以后要使用 WHERE 语句基于该字段进行查询时,才应该进行任何分区
    • cricket_007,使用 master=yarn 运行 spark-submit 时,找不到本地文件(即 spark.read.csv("file:///local_csv_dir") 失败)。是否可以读取本地文件并使用 master=yarn?谢谢
    • @Nir 仅当每个文件都分发到所有 YARN NodeManagers 时...否则,您必须将 --files 与 Spark 提交一起传递。这就是为什么我提到首先归档该数据,然后上传一个或多个更大的文件
    猜你喜欢
    • 2020-08-13
    • 2023-03-27
    • 2019-05-05
    • 1970-01-01
    • 2014-11-25
    • 2018-07-09
    • 2017-03-17
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多