我在Linux上有一个本地文件夹,其中包含成千上万个CSV文件。
每个csv文件约为1mb。
文件共享相同的列/格式,并通过文件名本身(即xxx_1.csv,xxx_2.csv,xxx_3,csv等)加以区分
现在,我想将目录加载到HDFS中,并以镶木地板格式保存。
在python(spark 2.3)中执行此操作的正确方法是什么?
谢谢
答案 0 :(得分:1)
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内并行读取一个文件,并写入不同的格式,或直接对其进行处理