scala - 从 spark 写入 hadoop 的最佳实践
问题描述
我正在查看一位同事编写的一些代码,我发现了一个这样的方法:
def writeFile(df: DataFrame,
partitionCols: List[String],
writePath: String): Unit {
val df2 = df.repartition(partitionCols.get.map(col): _*)
val dfWriter = df2.write.partitionBy(partitionCols.get.map(col): _*)
dfWriter
.format("parquet")
.mode(SaveMode.Overwrite)
.option("compression", "snappy")
.save(writePath)
}
repartition
像这样调用一组预定义的列,然后调用partitionBy
,然后保存到磁盘通常是一种好习惯吗?
解决方案
通常,您repartition
使用与 相同的列进行调用,partitionBy
以便在每个分区中有一个 parquet 文件。这是在这里实现的。现在您可以争辩说,这可能意味着 parquet 文件大小变大或更糟可能导致内存溢出。
这个问题通常通过向 Dataframe 添加 row_number 来处理,然后指定每个 parquet 文件可以拥有的文档数。就像是
val repartitionExpression =colNames.map(col) :+ floor(col(RowNumber) / docsPerPartition)
// now use this to repartition
要回答下一部分,因为persist after partitionBy
这里不需要,因为分区后它直接写入磁盘。
推荐阅读
- python - wxpython:制作窗口时如何使窗口全尺寸?
- c# - 如何用 ASP.NET 身份用户数据替换替换 Html.Raw 文本
- python - Is it possible to take a trained CNN stored as a .mat file and use that file to make a classification algorithm in Python?
- web-services - 这些大公司是如何从这三个要点出发的?
- amazon-web-services - 下载仅包含 aws 登录信息且没有 pem 密钥的 EC2 实例内容
- ios - areTimestampsInSnapshotsEnabled' 已弃用
- r - r中数据框列从字符到日期的条件转换
- javascript - 使用 pauli 帐户在 Meteor 中集成 LinkedIn
- sql-server - 删除未使用的索引
- javascript - 引导按钮下拉菜单将所选值设置为 li