Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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中的多个元素上实现条件模式匹配?_Scala_Apache Spark_Data Science - Fatal编程技术网

如何在Scala/Spark中的多个元素上实现条件模式匹配?

如何在Scala/Spark中的多个元素上实现条件模式匹配?,scala,apache-spark,data-science,Scala,Apache Spark,Data Science,我正在写一个方法,根据我在某个范围内看到的唯一标签对时间序列中的元素进行分类。例如,我有一个桔子、一个苹果和一个梨,我在一天中的不同时间间隔看到桔子、苹果和梨。根据这些时间间隔的组合,我将水果分类成带标签的篮子 我有一个RDD,它由一个元组(水果,小时)组成。我的计划是建立一个累加器,根据水果满足每小时条件的次数递增 var labelAccum = sc.accumulator(0) countedData.map(x => iterator(x)).filter(_.equals("

我正在写一个方法,根据我在某个范围内看到的唯一标签对时间序列中的元素进行分类。例如,我有一个桔子、一个苹果和一个梨,我在一天中的不同时间间隔看到桔子、苹果和梨。根据这些时间间隔的组合,我将水果分类成带标签的篮子

我有一个RDD,它由一个元组(水果,小时)组成。我的计划是建立一个累加器,根据水果满足每小时条件的次数递增

var labelAccum = sc.accumulator(0)

countedData.map(x => iterator(x)).filter(_.equals("label")).collect().foreach(x => labelAccum += 1)
完整定义返回
Map(“label”->labelAccum.value)
,它表示带标签的篮子和篮子中水果数量的映射。对于一个条件,它工作得很好,但是当添加多个条件时会出现问题。下面是迭代器(x),它使用模式匹配将水果放入相应的时隙中:

def iterator(x: (fruit, hour)): String = {

x.fruit match {
  case fruit if (6 until 10 contains x.hour) || (16 until 20 contains x.hour) => "label" }
}
因此,要将水果标记为“标签”,它需要同时满足这两个条件。但是,定义一次只能读取一个(水果,小时)。为了匹配每个条件,我需要读取水果拥有的所有小时数,如果水果拥有的任何小时数与时间间隔匹配,则标记它们。
有没有办法通过模式匹配来实现这一点?有枚举/命令式方法和方法可以有条件地使用已过滤的RDD触发迭代器,但我很好奇是否有一种优雅的解决方案与模式匹配兼容。

除了性能之外,不应该
(6到10包含x.hour)和&(16到20包含x.hour)
总是错误的吗,但也许问题可以重新表述为:match语句上游的哪些步骤和更改可以使此返回为真?理想情况下,它会读取每个水果的所有小时数,并根据整组小时数(而不是每个小时)做出匹配决定。使用逻辑析取?它实际上在我们的代码库中用析取重写为
(6到10包含x.hour)|(16到20包含x.hour)
。也许为了减少混淆,我应该用这个来修改这个问题,但它仍然不能回避这样一个问题:模式匹配语句一次对一个(水果,小时)进行分类,并且标签只有在水果在两个时间间隔出现时才有意义,一个&&语句“MorningAndEvening”篮子需要两个元组,(水果,hourMorning)和(水果,HourRevening)。问题是迭代器一次只读取一个(水果,小时),而不是与每个水果关联的多个小时。