scala如何动态地将未知变量发送到单个方法

时间:2018-03-02 10:21:05

标签: scala apache-spark

我有两个变量,如下所示,每个变量都有相同数量的元素。在这种情况下,我的变量1和2包含3个元素。

val myVar  = List(first,second,third)
val mySecondVar  = List(one,two,three)

现在我必须根据元素的数量调用一个方法,因为我的variable1(myvar)包含3个值,因此我需要调用我的方法3次,它也可能会增加。但是条件是当我调用方法第一次输入参数时,方法应该是第一个变量的第一个元素,第一个调用第二个变量的第一个元素将作为df(来自csv文件的数据)传递。从csv文件读取数据后,将根据第一个和第二个参数过滤数据,结果应该传递给第三个参数的第二次迭代。

第二次迭代:方法的第一个参数是变量1的第二个元素,第二个参数是变量2的第二个元素,现在第三个参数应该包含第一次迭代的结果。将再次做一些逻辑将数据存储在一个变量中,结果应传递给第三次迭代。

val input = spark.read.option("header", "true").option("inferSchema", "false").csv("matching.csv")
var result = method(first,one,input)
var result2 = method(second,two,result)
var result3 = method(third,three,result2)

def(myvar : Any,mySecondVar : Any,input : org.apache.spark.sql.DataFrame) : 
org.apache.spark.sql.DataFrame={
//some logic
return "result"
}

1 个答案:

答案 0 :(得分:0)

这看起来像你想要一个递归函数来重复遍历列表中的元素。

致电代码:

val csvData: OutputType = getCsvFileData()
val result: OutputType = myMethod(myVar, mySecondVar, csvData)

递归函数:

def myRecursiveMethod(list1: List[String], list2: List[String], input: OutputType): OutputType = {
  val ongoingResult = doCalculation(list1.head, list2.head, input)
  if (list1.tail.nonEmpty) && (list2.tail.nonEmpty)
    myRecursiveMethod(list1.tail, list2.tail, ongoingResult)
  else
    ongoingResult
}

此方法逐步执行两个列表中的条目,并每次传递计算函数的输出,直到列表为空。请注意,因为doCalculation()函数的输出都被myRecursiveMethod传入并返回,所以它必须在第一次传递给函数之前具有类型OutputType。