Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中带Spark udf的范围模式匹配_Scala_Apache Spark_Pattern Matching_User Defined Functions - Fatal编程技术网

Scala中带Spark udf的范围模式匹配

Scala中带Spark udf的范围模式匹配,scala,apache-spark,pattern-matching,user-defined-functions,Scala,Apache Spark,Pattern Matching,User Defined Functions,我有一个Spark数据框,其中包含字符串,我使用Likert量表匹配数字分数。不同的问题ID对应不同的分数。我试图在ApacheSpark udf中的Scala范围内进行模式匹配,并将此问题作为指导: 但是当我使用范围而不是简单的OR语句时,我得到了一个编译错误, i、 e 31 | 32 | 33 | 34 31到35不编译。你知道我在语法上哪里出错了吗 另外,在最后一种情况下,我想映射到字符串而不是Int, case\u=>“无”但这会给出一个错误: java.lang.Unsupport

我有一个Spark数据框,其中包含字符串,我使用Likert量表匹配数字分数。不同的问题ID对应不同的分数。我试图在ApacheSpark udf中的Scala范围内进行模式匹配,并将此问题作为指导:

但是当我使用范围而不是简单的OR语句时,我得到了一个编译错误, i、 e

31 | 32 | 33 | 34

31到35不编译。你知道我在语法上哪里出错了吗

另外,在最后一种情况下,我想映射到字符串而不是Int,
case\u=>“无”
但这会给出一个错误:
java.lang.UnsupportedOperationException:不支持任何类型的架构

这大概是Spark的一个通用问题,因为在原生Scala中返回
Any
是完全可能的

这是我的密码:

def calculateScore = udf((questionId: Int, answerText: String) => (questionId, answerText) match {

      case ((31 | 32 | 33 | 34 | 35), "Rarely /<br>Never") => 4 //this is fine
      case ((31 | 32 | 33 | 34 | 35), "Occasionally") => 3
      case ((31 | 32 | 33 | 34 | 35), "Often") => 2
      case ((31 | 32 | 33 | 34 | 35), "Almost always /<br>Always") => 1
      case ((x if 41 until 55 contains x), "None of the time") => 1 //this line won't compile
      case _ => 0 //would like to map to "None"
    })

保护表达式应放在图案后面:

def calculateScore = udf((questionId: Int, answerText: String) => (questionId, answerText) match {
  case ((31 | 32 | 33 | 34 | 35), "Rarely /<br>Never") => 4 
  case ((31 | 32 | 33 | 34 | 35), "Occasionally") => 3
  case ((31 | 32 | 33 | 34 | 35), "Often") => 2
  case ((31 | 32 | 33 | 34 | 35), "Almost always /<br>Always") => 1
  case (x, "None of the time") if 41 until 55 contains x => 1
  case _ => 0 //would like to map to "None"
})
def calculateScore=udf((questionId:Int,answerText:String)=>(questionId,answerText)匹配{
案例((31 | 32 | 33 | 34 | 35),“很少/从不”)=>4
案例((31 | 32 | 33 | 34 | 35),“偶尔”)=>3
案例((31 | 32 | 33 | 34 | 35),“经常”)=>2
案例((31 | 32 | 33 | 34 | 35),“几乎总是/
总是”)=>1 如果41到55包含x=>1,则案例(x,“无时间”) 案例=>0//要映射到“无” })
保护表达式应放在图案后面:

def calculateScore = udf((questionId: Int, answerText: String) => (questionId, answerText) match {
  case ((31 | 32 | 33 | 34 | 35), "Rarely /<br>Never") => 4 
  case ((31 | 32 | 33 | 34 | 35), "Occasionally") => 3
  case ((31 | 32 | 33 | 34 | 35), "Often") => 2
  case ((31 | 32 | 33 | 34 | 35), "Almost always /<br>Always") => 1
  case (x, "None of the time") if 41 until 55 contains x => 1
  case _ => 0 //would like to map to "None"
})
def calculateScore=udf((questionId:Int,answerText:String)=>(questionId,answerText)匹配{
案例((31 | 32 | 33 | 34 | 35),“很少/从不”)=>4
案例((31 | 32 | 33 | 34 | 35),“偶尔”)=>3
案例((31 | 32 | 33 | 34 | 35),“经常”)=>2
案例((31 | 32 | 33 | 34 | 35),“几乎总是/
总是”)=>1 如果41到55包含x=>1,则案例(x,“无时间”) 案例=>0//要映射到“无” })
如果要将最后一个
案例
案例
映射到“无”
字符串
,则所有案例也应返回
字符串

以下
udf
功能应该适合您

def calculateScore  = udf((questionId: Int, answerText: String) => (questionId, answerText) match {
  case ((31 | 32 | 33 | 34 | 35), "Rarely /<br>Never") => "4" //this is fine
  case ((31 | 32 | 33 | 34 | 35), "Occasionally") => "3"
  case ((31 | 32 | 33 | 34 | 35), "Often") => "2"
  case ((31 | 32 | 33 | 34 | 35), "Almost always /<br>Always") => "1"
  case (x, "None of the time") if (x >= 41 && x < 55) => "1" //this line won't compile
  case _ => "None"
})
def calculateScore  = udf((questionId: Int, answerText: String) => (questionId, answerText) match {
  case ((31 | 32 | 33 | 34 | 35), "Rarely /<br>Never") => Some(4) //this is fine
  case ((31 | 32 | 33 | 34 | 35), "Occasionally") => Some(3)
  case ((31 | 32 | 33 | 34 | 35), "Often") => Some(2)
  case ((31 | 32 | 33 | 34 | 35), "Almost always /<br>Always") => Some(1)
  case (x, "None of the time") if (x >= 41 && x < 55) => Some(1) //this line won't compile
  case _ => None
})

最后一点是,您收到的错误消息
java.lang.UnsupportedOperationException:Schema for type Any不受支持
明确指出,返回类型为
Any
udf
函数不受支持。来自
匹配案例
的所有
返回类型
应一致。

如果要将最后一个
案例
案例
映射为“无”
字符串
,则所有案例也应返回
字符串

以下
udf
功能应该适合您

def calculateScore  = udf((questionId: Int, answerText: String) => (questionId, answerText) match {
  case ((31 | 32 | 33 | 34 | 35), "Rarely /<br>Never") => "4" //this is fine
  case ((31 | 32 | 33 | 34 | 35), "Occasionally") => "3"
  case ((31 | 32 | 33 | 34 | 35), "Often") => "2"
  case ((31 | 32 | 33 | 34 | 35), "Almost always /<br>Always") => "1"
  case (x, "None of the time") if (x >= 41 && x < 55) => "1" //this line won't compile
  case _ => "None"
})
def calculateScore  = udf((questionId: Int, answerText: String) => (questionId, answerText) match {
  case ((31 | 32 | 33 | 34 | 35), "Rarely /<br>Never") => Some(4) //this is fine
  case ((31 | 32 | 33 | 34 | 35), "Occasionally") => Some(3)
  case ((31 | 32 | 33 | 34 | 35), "Often") => Some(2)
  case ((31 | 32 | 33 | 34 | 35), "Almost always /<br>Always") => Some(1)
  case (x, "None of the time") if (x >= 41 && x < 55) => Some(1) //this line won't compile
  case _ => None
})

最后一点是,您收到的错误消息
java.lang.UnsupportedOperationException:Schema for type Any不受支持
明确指出,返回类型为
Any
udf
函数不受支持。来自
匹配案例的所有
返回类型
应该是一致的。

UDF的思想是它返回一个可以在SQL语句中使用的结果。因此,它必须是Int、String或其他受支持的类型。在SQL上下文中,Any没有任何意义。在这里,您正在做一些本质上类似的事情,只是使用数据帧而不是直接使用SQL。不过,如果您真的希望在通配符的情况下有不同的行为(我不理解您为什么会这样做),也许您可以返回-1或类似的值。或者,让其他案例返回字符串。@Phasmid我正在清理一个我正在执行分析的数据文件。该文件当前的格式是一长串问题,我将这些问题的答案作为轴心。一些响应需要是字符串,其他响应需要是整数、双精度等。当我旋转数据轴时,我将为每个响应设置模式。所以我需要列的输出是灵活的——因此使用了Any。虽然使用-1是个好主意。但是我意识到使用Any是不可能的,所以我将使用字符串而不是int。UDF的思想是它返回一个可以在SQL语句中使用的结果。因此,它必须是Int、String或其他受支持的类型。在SQL上下文中,Any没有任何意义。在这里,您正在做一些本质上类似的事情,只是使用数据帧而不是直接使用SQL。不过,如果您真的希望在通配符的情况下有不同的行为(我不理解您为什么会这样做),也许您可以返回-1或类似的值。或者,让其他案例返回字符串。@Phasmid我正在清理一个我正在执行分析的数据文件。该文件当前的格式是一长串问题,我将这些问题的答案作为轴心。一些响应需要是字符串,其他响应需要是整数、双精度等。当我旋转数据轴时,我将为每个响应设置模式。所以我需要列的输出是灵活的——因此使用了Any。使用-1是个好主意。但是我意识到使用Any是不可能的,所以我将使用字符串而不是int。这两个答案都非常有用,谢谢你们。这两个答案都非常有用,谢谢你们