csv - 如何将 csv 的目录作为镶木地板加载到 hdfs
问题描述
我在 linux 上有一个包含数千个 CSV 文件的本地文件夹。
每个 csv 文件约为 1mb。
这些文件共享相同的列/格式,并通过文件名本身来区分(即 xxx_1.csv、xxx_2.csv、xxx_3、csv 等)
现在,我想将目录加载到 HDFS 中,并以 parquet 格式保存。
在 python (spark 2.3) 中正确的方法是什么?
- 加载整个目录的最佳方法是什么?
- 我应该使用什么分区?(文件名应该是分区吗?还是将文件名添加为新列更好?)
谢谢
解决方案
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 中并行读取该文件,并写入不同格式或直接处理它
推荐阅读
- javascript - 在 iframe 加载之前设置 URL
- c# - Razor @Html.ActionLink 将当前 ID 添加到路径 - 为什么?
- c# - 如何返回 C# 方法调用的语法上下文
- linux - 使用 find 命令递归重命名每个目录中最大的 txt 文件,包括测试用例代码
- php - PHP - 从多维字符串中删除元素
- java - 不兼容的 Spring Boot 版本导致应用程序无法启动。我们如何识别 pom 中包含的错误版本
- swift - 在按钮单击大纲视图上创建新的列单元格
- linux - 有没有办法使用 Wireshark 或 Tcpdump 检查套接字优先级?
- python - 如何使用 gensim KeyedVectors 减去和添加向量?
- tcp - TCP上的注册消息