我想要将本地 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 类型列中的信息。
嗯,库中的值类型数组处理存在一个微妙的问题。修复将在下一个版本中提供。同时,您可以通过使用
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);
}