- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在从流中读取 Avro 消息并使用 parquet.hadoop.ParquetWriter 将它们写入 Parquet 文件。我试图让输出文件的大小超过阈值限制。问题是 ParquetWriter 将所有内容都保存在内存中,并且只在 writer 关闭时才将其写入磁盘。根据 Parquet 文档,数据以最终格式写入内存对象,这意味着内存中对象的大小与磁盘上的最终大小相同。我的问题是如何获取内存中写入数据的大小,以便决定关闭编写器?
我尝试使用写入 ParquetWriter 的 avro 消息的字节大小作为 Parquet writer 文件大小的估计值,但这与 parquet writer 大小有很大不同,因为 parquet 存储数据的方式不同(柱状格式)。这是我所做的伪代码:
ParquetWriter parquetWriter = new ParquetWriter(..., BLOCK_SIZE, PAGE_SIZE);
long bytesWrittenSofar = 0;
public long getLength(){
return bytesWrittenSofar;
}
public void write(org.apache.avro.generic.GenericRecord record){
parquetWriter.write(record);
bytesWrittenSofar += avroToBytes(record).length;
}
public static byte[] avroToBytes(GenericRecord record){
GenericDatumWriter<GenericRecord> writer =
new GenericDatumWriter<GenericRecord>(record.getSchema());
ByteArrayOutputStream out = new ByteArrayOutputStream();
BinaryEncoder encoder = EncoderFactory.get().binaryEncoder(out, null);
writer.write(record, encoder);
encoder.flush();
out.close();
return out.toByteArray();
}
事实证明,我从 getLength() 获得的值与 parquet 文件的实际文件大小有很大不同。我知道架构将添加到文件末尾,但它非常小。只是给你一个想法,当 getLength() 报告 130MB 时,实际文件大小只有 80MB。
最佳答案
我没有找到访问 ParquetWriter 使用的内存的方法。相反,我最终分析了上传的文件大小和其中写入的记录数。使用以前的数据并通过计算写入当前文件的记录数,我估计了当前正在进行的文件的文件大小。事实证明,这比任何其他尝试都更接近真实文件大小。但是,这在很大程度上取决于您编写的应用程序和记录的变化。
关于java - 如何在关闭它并将其写入磁盘之前获取 ParquetWriter 对象的内存大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28888062/
我正在尝试创建接受参数(OutputFile、Mode、WriteSupport、 CompressionCodecName、int、boolean、Configuration、int、Parquet
我正在从流中读取 Avro 消息并使用 parquet.hadoop.ParquetWriter 将它们写入 Parquet 文件。我试图让输出文件的大小超过阈值限制。问题是 ParquetWrite
我试图将现有的 avro 文件转换为 parquet。但是输出的 Parquet 文件是空的。我不确定我做错了什么...... 我的代码片段: FileReader fileReader =
我正在尝试将一个大的 Parquet 文件写入磁盘(比内存大)。我天真地以为我可以聪明地使用 ParquetWriter 和 write_table 来增量写入文件,像这样(POC): import
我编写了一个消费者,它从 kafka 主题读取数据并使用 StreamSink 以 parquet 格式写入数据。但我收到以下错误 java.lang.Exception: org.apache.fl
我有一个使用 org.apache.parquet.hadoop.ParquetWriter 的工具将 CSV 数据文件转换为 parquet 数据文件。 目前,它只处理int32、double和st
我有一个使用 org.apache.parquet.hadoop.ParquetWriter 的工具将 CSV 数据文件转换为 Parquet 数据文件。 我可以很好地编写基本的原始类型(INT32、
我是一名优秀的程序员,十分优秀!