如何使用 ChoParquetWriter 将包含 blob/clob/nclob 列的 DataTable 写入 parquet 文件

问题描述 投票:0回答:1

我想要将本地 Oracle 数据库表的副本保存在 parquet 文件中。该数据库中有许多不同的表和所有者,因此我决定使用

DataTable
使此过程尽可能简单。我正在使用 ChoETL 的
ChoParquetWriter
。不幸的是它抛出了异常

ChoETL.ChoMissingRecordFieldException:“在以下位置找不到匹配的属性 '' Parquet 柱的对象。”

DataTable
对象写入镶木地板文件时。在
DataTable
中有一个BLOB类型的列。

我正在使用函数下载DataTable:

public DataTable GetDataTableFromOracleTable(string connectionString, string owner, string tableName)
{
    DataTable returnedTable = new DataTable();
    OracleConnection connection = new OracleConnection(connectionString);
    connection.Open();
    using (OracleCommand dataCmd = new OracleCommand($"SELECT * FROM {owner}.{tableName}", connection))
    {
        using (OracleDataAdapter adapter = new OracleDataAdapter(dataCmd))
        {
            DataTable table = new DataTable($"{owner}_{tableName}");
            adapter.Fill(returnedTable);
        }
    }
    connection.Close();
    return returnedTable;
}

然后我尝试将此数据表写入镶木地板文件中。

using (var parser = new ChoParquetWriter(parquetSourcePath).
    Configure(c => c.CompressionMethod = Parquet.CompressionMethod.Gzip)
    .Setup(s => s.BeforeRecordFieldWrite += (o, e) =>
    {
        if (e.Source == DBNull.Value)
            e.Source = null;
    })
    )
{
    parser.Write(testTable);
}

我尝试用谷歌搜索这个并询问chatGPT,但我已经没有想法了。

请帮助我编写镶木地板文件,这样我就不会丢失 BLOB 类型列中的信息。

c# oracle parquet lob choetl
1个回答
0
投票

嗯,库中的值类型数组处理存在一个微妙的问题。修复将在下一个版本中提供。同时,您可以通过使用

UseNestedKeyFormat(false)

来解决这个问题
using (var parser = new ChoParquetWriter(parquetSourcePath).
    Configure(c => c.CompressionMethod = Parquet.CompressionMethod.Gzip)
    .Setup(s => s.BeforeRecordFieldWrite += (o, e) =>
    {
        if (e.Source == DBNull.Value)
            e.Source = null;
    })
    .UseNestedKeyFormat(false)
    )
{
    parser.Write(testTable);
}
© www.soinside.com 2019 - 2024. All rights reserved.