好的,我正在使用SSIS脚本组件作为目标写入avro文件。由于AVRO也需要模式,因此我需要定义模式。当我手动定义架构时,它可以正常工作。但是我有10到12个数据流任务,并且我不想显式地编写模式。我正在尝试查看是否可以使用自动生成的BufferWrapper,以查看是否可以从中读取内容,但无法读取,并且始终返回空白。
我尝试过发布here的解决方案,还阅读了this。 但是一切都变成空白。
我也遇到过this。可能是原因,如果答案中的解释正确无误,这是不可能的吗?
所以,在我的 公共重写void PreExecute(),我有这样的东西:
Schema = @"{
""type"":""record"",
""name"":""Microsoft.Hadoop.Avro.Specifications.Counterparts"",
""fields"":
[
{ ""name"":""CounterpartID"", ""type"":""int"" },
{ ""name"":""CounterpartFirstDepositDate"", ""type"":[""string"",""null""] },
{ ""name"":""CounterpartFirstTradeDate"",""type"":[""string"",""null""] },
{ ""name"":""ClientSegmentReportingID"",""type"":[""int"",""null""] },
{ ""name"":""ClientSegmentReportingName"", ""type"":[""string"",""null""] },
{ ""name"":""ContractID"", ""type"":[""int"",""null""] },
{ ""name"":""ContractFirstDepositDate"", ""type"":[""string"",""null""] },
{ ""name"":""ContractFirstTradeDate"",""type"":[""string"",""null""] },
{ ""name"":""ContractClosingOffice"",""type"":[""string"",""null""] },
{ ""name"":""LeadCreationDate"", ""type"":[""string"",""null""] },
{ ""name"":""ContractCountryOfResidence"", ""type"":[""string"",""null""] }
]
}";
}
我正在检查是否可以从BufferWrapper中生成它,而不是手动定义所有这种模式,但这将返回空白:
var fields = typeof(Input0Buffer).GetFields().Select(m => new
{
Name = m.Name,
Type = m.FieldType
}).ToList();
此外,如果我只是这样做,那还会返回空白
类型myType = typeof(Input0Buffer);
// Get the fields of the specified class.
FieldInfo[] myField = myType.GetFields();
我之前将这些新方法放在Pre-Execute中,但是后来想,也许那个缓冲区还没有被初始化,所以我将其移到Input0_ProcessInputRow方法中,并确保使用计数器变量仅触发一次它,此代码仅在counter = 0时运行,即使返回空也是如此。
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
if (counter == 0)
{
Type myType = typeof(Input0Buffer);
// Get the fields of the specified class.
FieldInfo[] myField = myType.GetFields();
}
//Processing logic
}
难道不是因为this吗?
谈到它是受保护的,并且也无法从该自动生成的类外部进行访问。
答案 0 :(得分:1)
我终于在这里找到了答案:https://waheedrous.wordpress.com/2014/02/24/ssis-global-replace-for-all-columns-using-a-script-component/
我最终可以从脚本组件中获取列和数据类型的列表。我只会在第一次运行(使用计数器变量)。