我在SQL Server 2012 Express中创建了一个缩放器UDF(称为sCurrentAppUser()),我想在定义表时使用此UDF作为默认值.但每次我尝试时,都会收到"'sCurrentAppUser'不是公认的内置函数名称的错误."
由于我还不能发布两个以上的链接(声誉),我会在评论中链接到我的研究和参考文献.
这是我的UDF:
ALTER FUNCTION [dbo].[sCurrentAppUser] ()
RETURNS nVarChar(128)
AS BEGIN
DECLARE @CurrentAppUser nVarChar(128)
IF EXISTS (SELECT 1 FROM ActiveConnections WHERE ComputerName = host_name ()) BEGIN
SELECT @CurrentAppUser = CONVERT (nVarChar(128), LoginUser)
FROM ActiveConnections
WHERE ComputerName = host_name ()
END ELSE BEGIN
SELECT @CurrentAppUser = Convert (nVarChar(128), suser_sname ())
WHERE NOT EXISTS (
SELECT 1
FROM ActiveConnections
WHERE ComputerName = host_name ()
)
END
RETURN @CurrentAppUser
END
Run Code Online (Sandbox Code Playgroud)
我试图在第一列创建具有默认约束的表:
CREATE TABLE [dbo].[Clients](
[ModifyingUser] [nvarchar](128) NOT NULL DEFAULT sCurrentAppUser …Run Code Online (Sandbox Code Playgroud) 我已经成功创建了一个Python UDF,它接受表中的varchar值,并根据正则表达式提取该值的子字符串.
DDL中varchar列的最大大小设置为20000字节,在某些情况下,当我尝试调用它时UDF输出错误:
ERROR: Value too long for character type
Detail:
-----------------------------------------------
error: Value too long for character type
code: 8001
context: Value too long for type character varying(256)
query: 1127608
location: funcs_string.hpp:390
process: query0_73 [pid=25345]
-----------------------------------------------
Run Code Online (Sandbox Code Playgroud)
是否UDF输入变量的max varchar限制设置为256字节?如果是的话,这是我可以在我的代码中更改的内容吗?
谢谢,
基于Coldfusion文档..." 数组通过值传递给用户定义的函数,因此函数获取数组数据的新副本,并且调用页面中的数组不会被函数更改. "
所以我正在做一个小练习项目.我首先获取一个数字列表,将其转换为数组(我称之为cardArray),然后对数组进行排序,最后将数组传递给几个UDF,这些UDF将查找数字中的各种模式,并进行操作(如果需要) )参数(也就是传递的数组).
我从不在UDF中引用原始数组,我只引用参数名称.仍然...如果我在调用函数后cfdump原始数组,我的原始数组已被更改.谁能告诉我为什么?
我很确定我可以解决这个问题.因此,解决这个问题不是我的大问题.我的问题是,这种行为完全违背了我"认为"这种行为的方式,这让我发疯了!
function hasPair(pairArray) {
pairCount = 0;
for (i=2; i lte arrayLen(pairArray); i++){
if(pairArray[i] is pairArray[i-1]){
pairCount++
arrayDeleteAt(pairArray, i)
arrayDeleteAt(pairArray, i-1)
i=2
}
}
return pairCount;
}
function hasStraight(straightArray){
sequenceCards = 0;
for (i=2; i lte arrayLen(straightArray); i++){
if(straightArray[i] - straightArray[i-1] is 1){
sequenceCards++
}
}
if (sequenceCards GTE 4){
return 1;
}
else{
return 0;
}
}
</cfscript>
<cfoutput>
<cfset cardList = "5,6,7,8,10,8,9">
<cfset cardArray = listToArray(cardList)>
<cfdump var="#cardArray#" label="Original Array Before">
<cfset …Run Code Online (Sandbox Code Playgroud) 在我的项目中,我想实现ADD(+)函数,但我的参数可能LongType是DoubleType,IntType.我用sqlContext.udf.register("add",XXX),但我不知道怎么写XXX,这是制作泛型函数.
我试图从包含scala函数定义的字符串中定义spark(2.0)中的udf.这是片段:
val universe: scala.reflect.runtime.universe.type = scala.reflect.runtime.universe
import universe._
import scala.reflect.runtime.currentMirror
import scala.tools.reflect.ToolBox
val toolbox = currentMirror.mkToolBox()
val f = udf(toolbox.eval(toolbox.parse("(s:String) => 5")).asInstanceOf[String => Int])
sc.parallelize(Seq("1","5")).toDF.select(f(col("value"))).show
Run Code Online (Sandbox Code Playgroud)
这给了我一个错误:
Caused by: java.lang.ClassCastException: cannot assign instance of scala.collection.immutable.List$SerializationProxy to field org.apache.spark.rdd.RDD.org$apache$spark$rdd$RDD$$dependencies_ of type scala.collection.Seq in instance of org.apache.spark.rdd.MapPartitionsRDD
at java.io.ObjectStreamClass$FieldReflector.setObjFieldValues(ObjectStreamClass.java:2133)
at java.io.ObjectStreamClass.setObjFieldValues(ObjectStreamClass.java:1305)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2024)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2018)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1942)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1808)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373)
at org.apache.spark.serializer.JavaDeserializationStream.readObject(JavaSerializer.scala:75)
at org.apache.spark.serializer.JavaSerializerInstance.deserialize(JavaSerializer.scala:114)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)
at org.apache.spark.scheduler.Task.run(Task.scala:85)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:274)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) …Run Code Online (Sandbox Code Playgroud) 我正在努力处理在由浮点数结构组成的数据帧(源自配置单元表)上运行的UDF中的空值:
数据框(points)具有以下架构:
root
|-- point: struct (nullable = true)
| |-- x: float (nullable = true)
| |-- y: float (nullable = true)
Run Code Online (Sandbox Code Playgroud)
例如,我要计算x和y的总和。请注意,我不“处理”空值在下面的例子,但我希望能够在我的UDF检查是否point,x或者y是null。
第一种方法:
val sum = udf((x:Float,y:Float) => x+y)
points.withColumn("sum",sum($"point.x",$"point.y"))
Run Code Online (Sandbox Code Playgroud)
如果该struct点为null,则此方法不起作用,在这种情况下,永远不会评估udf(永远不会执行udf中的代码!),结果为null。另外,我无法检查x或y为null,因为Floats在scala中不能为null。
第二种方法:
val sum = udf((pt:Row) => pt.getFloat(0)+pt.getFloat(1))
points.withColumn("sum",sum($"point"))
Run Code Online (Sandbox Code Playgroud)
使用这种方法,我可以pt在udf中检查是否为空,但是我可以检查x并且y因为Floats不能为空。NullPointerException在这种情况下,我得到一个。
如何编写udf win,可以检查struct以及x和y是否为null?
我正在使用spark 1.6.1
更新:与这个问题相反,我在处理浮点数而不是字符串(scala中的字符串可以为null,而浮点数则不是)
我试图将一个元组列表传递给scala中的udf.我不确定如何为此精确定义数据类型.我试图将它作为整行传递,但它无法真正解决它.我需要根据元组的第一个元素对列表进行排序,然后再发送n个元素.我为udf尝试了以下定义
def udfFilterPath = udf((id: Long, idList: Array[structType[Long, String]] )
def udfFilterPath = udf((id: Long, idList: Array[Tuple2[Long, String]] )
def udfFilterPath = udf((id: Long, idList: Row)
Run Code Online (Sandbox Code Playgroud)
这就是idList的样子:
[[1234,"Tony"], [2345, "Angela"]]
[[1234,"Tony"], [234545, "Ruby"], [353445, "Ria"]]
Run Code Online (Sandbox Code Playgroud)
这是一个如上所述的100行数据帧.我把udf称为如下:
testSet.select("id", "idList").withColumn("result", udfFilterPath($"id", $"idList")).show
Run Code Online (Sandbox Code Playgroud)
当我打印数据帧的架构时,它将其作为结构数组读取.idList本身是通过在由密钥分组并存储在数据帧中的元组列上执行收集列表来生成的.关于我做错了什么的任何想法?谢谢!
我想从两个已经工作的函数构建一个UDF.我正在尝试将md5哈希计算为现有Spark Dataframe的新列.
def md5(s: String): String = { toHex(MessageDigest.getInstance("MD5").digest(s.getBytes("UTF-8")))}
def toHex(bytes: Array[Byte]): String = bytes.map("%02x".format(_)).mkString("")
Run Code Online (Sandbox Code Playgroud)
结构(到目前为止我有什么)
val md5_hash: // UDF Implementation
val sqlfunc = udf(md5_hash)
val new_df = load_df.withColumn("New_MD5_Column", sqlfunc(col("Duration")))
Run Code Online (Sandbox Code Playgroud)
不幸的是,我不知道如何将该函数作为UDF实现.
我需要在数据库更改时发送HTTP请求,因此我使用的是mysqludf扩展.
它在本地工作,但我怎样才能让它在Amazon RDS上运行?如果不可能,我需要一个解决方案来使用MySQL触发器和sys_exec函数或类似的东西.
有人可以帮助我吗?
谢谢!
我有一个 Excel VBA 插件,可以添加用户定义的函数 (UDF)。这些函数在计算结果方面都工作得很好。
我使用 MacroOptions 将它们输入到函数向导中。
在工作表中使用它们时,它们会自动更正函数名称的大小写。例如,如果函数名为 MyFunction,并且用户将其输入为 myfunction,则在输入公式时,它会将函数名称的大小写自动更正为 MyFunction。就像 Excel 的内置工作表函数一样,如果您输入例如中位数,它会自动将其更正为中位数。
但是,有一个 UDF 的自动更正不正确。我希望它是例如 MyFunction,但即使用户这样输入它,它也会自动更正为所有小写字母 myfunction。
我查看了每一行相关的代码,但找不到任何原因。除了函数名称、函数描述以及函数本身的代码和参数之外,所有其他 UDF 的代码都是相同的。
知道为什么一个 UDF 以不同的方式自动更正函数名称吗?
以下是 MacroOptions 行的示例:
Application.MacroOptions "MyAddin.xla!MyFunction", "Description of MyFunction for the Excel's Function Wizard.", , , , , "Custom category in Function Wizard"
Run Code Online (Sandbox Code Playgroud)
UDF 本身如下所示:
Public Function MyFunction(param1 As Long, param2 As Long) As Long
'MyFunction's code here...
End Function
Run Code Online (Sandbox Code Playgroud)
同样,UDF 计算正确。问题在于函数名称的自动更正。
我尝试关闭该插件,然后创建一个新的 UDF,其函数名称与新的默认 Excel 工作簿中受影响的函数的名称相同。它工作正常——它自动更正为正确的大小写。但是当我关闭它并返回到插件时,问题又出现了。
更新:
以下是我解决问题的步骤(谢谢,查尔斯·威廉姆斯!):
udf ×10
apache-spark ×5
scala ×5
amazon-rds ×1
arrays ×1
coldfusion ×1
dml ×1
excel ×1
lucee ×1
mysql ×1
python ×1
sql-server ×1
vba ×1