我是spark的新手,我正在使用java编写的spark。我想从多个Parquet文件中读取数据集(每一行都是一个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)时,属于一个文件的行会混合到不同的分区中,从而导致冲突(这在某种程度上是意料之中的,因为重新分区是列哈希基)
有没有解决这个问题的方法或者其他方法来达到这个结果(我尝试将maxpartitionbytes增加到20gb,但没有成功)
暂无答案!
目前还没有任何答案,快来回答吧!