即使参数相同(连续),函数也会被多次调用吗?
Will a function be called multiple times even if the parameter is the same (in a row)?
假设我有一个名为 MyAssembly
的程序集,其中 class MyClass
有一个 MyFunction(long timestamp)
方法(它 return 将日期时间作为格式的字符串:YYYY-MM-DD HH24:mm:ss
)。如果我为这样的工作创建脚本:
@outputData =
SELECT MyAssembly.MyClass.MyFunction(t1.timestamp).Substring(0,4) AS Year
,MyAssembly.MyClass.MyFunction(t1.timestamp).Substring(...) AS Month
,MyAssembly.MyClass.MyFunction(t1.timestamp).Substring(...) AS Day
,MyAssembly.MyClass.MyFunction(t1.timestamp).Substring(...) AS Hour
,MyAssembly.MyClass.MyFunction(t1.timestamp).Substring(...) AS Minute
,MyAssembly.MyClass.MyFunction(t1.timestamp).Substring(...) AS Second
FROM @queryInput AS t1
该函数会被多次调用,还是系统 "clever" 足以只调用一次并为其他列使用 return 值?如果不是,我有什么选择?
我不确定 ADLA "clever" 是否足以处理您的情况,但您可以尝试使用 custom processor。它会为处理的每一行执行一次您的方法。
你的 Process 方法应该是这样的:
public override IRow Process(IRow input, IUpdatableRow output)
{
string timestamp = input.Get<string>("timestamp");
var myFunctionResult = MyAssembly.MyClass.MyFunction(timestamp);
output.Set<string>("Year", myFunctionResult.Substring(0,4));
output.Set<string>("Month", myFunctionResult.Substring(...));
//do this for other fields
return output.AsReadOnly();
}
在 USQL 中你的调用应该是这样的:
@outputData =
PROCESS @queryInput
PRODUCE Year string,
Month string,
...
REQUIRED timestamp
USING new MyAssembly.MyProcessor();
假设我有一个名为 MyAssembly
的程序集,其中 class MyClass
有一个 MyFunction(long timestamp)
方法(它 return 将日期时间作为格式的字符串:YYYY-MM-DD HH24:mm:ss
)。如果我为这样的工作创建脚本:
@outputData =
SELECT MyAssembly.MyClass.MyFunction(t1.timestamp).Substring(0,4) AS Year
,MyAssembly.MyClass.MyFunction(t1.timestamp).Substring(...) AS Month
,MyAssembly.MyClass.MyFunction(t1.timestamp).Substring(...) AS Day
,MyAssembly.MyClass.MyFunction(t1.timestamp).Substring(...) AS Hour
,MyAssembly.MyClass.MyFunction(t1.timestamp).Substring(...) AS Minute
,MyAssembly.MyClass.MyFunction(t1.timestamp).Substring(...) AS Second
FROM @queryInput AS t1
该函数会被多次调用,还是系统 "clever" 足以只调用一次并为其他列使用 return 值?如果不是,我有什么选择?
我不确定 ADLA "clever" 是否足以处理您的情况,但您可以尝试使用 custom processor。它会为处理的每一行执行一次您的方法。
你的 Process 方法应该是这样的:
public override IRow Process(IRow input, IUpdatableRow output)
{
string timestamp = input.Get<string>("timestamp");
var myFunctionResult = MyAssembly.MyClass.MyFunction(timestamp);
output.Set<string>("Year", myFunctionResult.Substring(0,4));
output.Set<string>("Month", myFunctionResult.Substring(...));
//do this for other fields
return output.AsReadOnly();
}
在 USQL 中你的调用应该是这样的:
@outputData =
PROCESS @queryInput
PRODUCE Year string,
Month string,
...
REQUIRED timestamp
USING new MyAssembly.MyProcessor();