如何解决在Spark
我是Spark的新手,正在使用用Java编写的Spark。我想从多个实木复合地板文件(每个行是一个Avro条目)中读取数据集,并过滤掉一些不符合条件的行,然后将这些行重新写回到其原始文件中。
我无法使用input.write.partitionBy("filename").format("parquet")
方法,因为由于通用的Avro模式导致无法读取Hadoop Map Reduce作业的结果写入文件
我有某种工作代码,我在文件名列中读取文件,然后按文件名重新分区。
int numFiles = countNumberOfFiles(inputPath);
Dataset<Row> input = spark.read.parquet(inputPath).withColumn("filename",input_file_name());
inputPath.filter(col("filterColumn").equalTo("test"))
.repartition(numFiles,col("filename"))
.foreachPartition(writeToFileFunc)
此方法的问题在于,有时输入数据集很大(> 1TB)时,属于1个文件的行会混合到不同的分区中,从而导致冲突。 (由于分区是基于列哈希的,所以这在某种程度上是可以预期的)
是否有解决此问题的方法或实现结果的替代方法? (我曾尝试将 maxPartitionBytes 增加到20GB,但没有运气)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。