分割parquet文件.py

"""
把 parquet 文件导出 n 个 csv 文件。

应用场景:
    分割大个 parquet 文件成小文件,方便分块下载。

"""
import math
import os
import shutil

import pandas as pd
import pyarrow.parquet as par


def parquet2dataFrame(parquet_path: str, split_pieces: int):
    """
    根据 batch_size 把大个的 parquet 文件分成若干份。
    采用生成器方式,节省内存(以时间换空间)。
    :param parquet_path: parquet 文件路径。
    :param split_pieces: 分割份数。
    :return:
    """
    parquet_file = par.ParquetFile(parquet_path, memory_map=True)
    num_rows = parquet_file.metadata.num_rows  # 记录条数。
    print("记录条数:", num_rows)

    # batch_size: Maximum number of records to yield per batch.
    #     Batches may be smaller if there aren't enough rows in the file.
    batch_size = math.ceil(num_rows / split_pieces)
    print("每份的最大记录数:", batch_size)

    for batch in parquet_file.iter_batches(batch_size=batch_size):
        batch_df = batch.to_pandas()
        yield batch_df


def dataFrame2file(df: pd.DataFrame, output_path: str, file_name: int, file_extension: str):
    """
    dataFrame 到文件。
    :param df: pandas.core.frame.DataFrame。
    :param output_path:输出目录,提前创建好。
    :param file_name: 文件名。
    :param file_extension:文件扩展名。
    :return:
    """
    basename = "%02d.%s" % (file_name, file_extension)
    print("basename:", basename)
    # print("df:", df)
    file_path = os.path.join(output_path, basename)
    if file_extension == "parquet":
        df.to_parquet(file_path)
    elif file_extension == "csv":
        df.to_csv(file_path)
    elif file_extension == "xls":
        df.to_excel(file_path)
    else:
        print(f"Please enter the correct file format, error file_data --> {file_extension}")


def main():
    file_name = 0  # 导出的 csv 文件名序号。

    # 删除目录。
    if os.path.exists(output_path):
        shutil.rmtree(output_path)
    os.makedirs(output_path, exist_ok=True)  # 创建目录。

    for df in parquet2dataFrame(parquet_path, split_pieces):
        dataFrame2file(df, output_path, file_name, "csv")
        file_name += 1

    print("done!")


if __name__ == '__main__':
    parquet_path = 'part-00039-5114fd87-297e-42b0-9d11-50f1df323dfa-c000.snappy.parquet'
    split_pieces = 12  # 分割份数。
    output_path = "39csv"

    main()
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用Apache POI和Apache Parquet库来将Java中的Excel文件转换为Parquet文件。首先,您需要使用POI库读取Excel文件中的数据,然后将其转换为Parquet格式并写入Parquet文件。您可以使用ParquetWriter类来写入Parquet文件。以下是一个示例代码片段: ``` // 导入所需的库 import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.parquet.hadoop.ParquetWriter; import org.apache.parquet.hadoop.metadata.CompressionCodecName; import org.apache.parquet.schema.MessageType; import org.apache.parquet.schema.MessageTypeParser; import org.apache.parquet.schema.Types; // 读取Excel文件 Workbook workbook = new XSSFWorkbook(new FileInputStream("input.xlsx")); Sheet sheet = workbook.getSheetAt(); // 定义Parquet文件的模式 MessageType schema = MessageTypeParser.parseMessageType("message ExcelData {\n" + " required binary column1;\n" + " required binary column2;\n" + "}"); // 创建Parquet文件的写入器 ParquetWriter<GenericRecord> writer = AvroParquetWriter.<GenericRecord>builder(new Path("output.parquet")) .withSchema(schema) .withCompressionCodec(CompressionCodecName.SNAPPY) .withDataModel(GenericData.get()) .build(); // 将Excel数据转换为Parquet格式并写入Parquet文件 for (Row row : sheet) { GenericRecord record = new GenericData.Record(schema); record.put("column1", row.getCell().getStringCellValue()); record.put("column2", row.getCell(1).getStringCellValue()); writer.write(record); } // 关闭写入器 writer.close(); ``` 请注意,您需要将上述代码中的输入和输出文件路径替换为您自己的路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值