apache-spark - HDFS 上大于块大小的文件不会分离
问题描述
我的HDFS块大小为256MB。我读取了一个大小为9.9GB的txt类型文件并使用spark将其转换为orc类型,并通过调用write
方法将其大小缩小到1.29GB:
dataframe.coalesce(16).write.mode("overwrite")
.partitionBy("myDate").
orc("hdfs://myhost:9090/user/hive/warehouse/ods/data.orc")
我想当我在 HDFS UI 上查看结果并浏览文件时,data.orc
目录下应该有 16 个文件,每个文件的大小小于块大小 256MB。但是,只有一个目录mydate=20210131
,当我进入它时,只有一个 1.29GB 的文件,比块大小 256MB 大得多。
这种情况让我很困惑,谁能告诉我:
- 为什么一个 1.29 GB 的文件可以放入一个 256MB 的块中?我这里有什么误解吗?
- 为什么即使我调用了 coalesce(16) 来尝试将它们分成 16 个分区从而有 16 个文件,文件也没有分成更小的文件?
- 如果我的文件小于 256MB,比如 200MB,剩余的 56MB 会被系统重用吗?
解决方案
- 我已经对自己说清楚了,大于块大小的文件保存在多个块中,但 HDFS 上只有一个文件。
- 在本地模式下,只有一个执行程序,即驱动程序。我
partiitonBy(mycol)
在我的代码中调用了,只有所以列中只有一个值mycol
,所以只有一个文件。 - 是的,未使用的空间不会被占用。
推荐阅读
- react-native - 如何解决snack.expo上的按钮不起作用但没有错误的问题
- azure - 如何从 blob 存储触发 azure 函数中删除流参数
- python - listdir 仅调用 CSV 文件
- haskell - 为什么参数可以接受类型类的任何构造,但不能有条件地构造其值?
- oracle - 如何通过使用带有 PLSQL 的触发器来修改包含特定值的 CLOB 行?
- android - 在 Android 活动中使用数据库中的数据
- arrays - IF 公式不返回任何内容
- reactjs - 打开一个新的 React Portal 只会打开一个没有内容的空页面
- php - WordPress 查询:按年份 DESC 对帖子进行分组,然后在每个组中按月 ASC 发布帖子
- couchbase - 沙发床 | 当文档大小为 5 MB 时如何减少选择查询执行时间