Просто предположите, что вы не ссылаетесь на библиотеки в проекте MAIN.
Это случилось со мной несколько раз.
Это мое решение с использованием наборов данных. Это дало бы безопасность типов и более чистый код. Но должен был бы оценить производительность. Это не должно сильно варьироваться.
case class EmployeeOperations(id: Int, operation: String, viewName: String,DiectoryName: String, query: String)
val data = Seq(
EmployeeOperations(0, "Load", "employeeview", "employee.empdetails", ""),
EmployeeOperations(1, "Query", "employeecountview", "", "select count(*) from employeeview"),
EmployeeOperations(2, "store", "employeecountview", "", "")
)
val ds: Dataset[EmployeeOperations] = spark.createDataset(data)(Encoders.product[EmployeeOperations])
printOperation(ds).show
def printOperation(ds: Dataset[EmployeeOperations])={
ds.map(x => x.operation match {
case "Query" => println("matching Query"); "Query"
case "Load" => println("matching Load"); "Load"
case "store" => println("matching store"); "store"
case _ => println("Found something else") ;"Nothing"
}
)
}
Я вернул здесь только строку для тестирования. Вы можете вернуть любой примитивный тип. Это вернуло бы:
scala> printOperation(ds).show
matching Load
matching Query
matching store
+-----+
|value|
+-----+
| Load|
|Query|
|store|
+-----+
Проверьте это:
scala> val df = Seq(
| (0,"Load","employeeview", "employee.empdetails", null ),
| (1,"Query","employeecountview",null,"select count(*) from employeeview"),
| (2,"store", "employeecountview",null,null)
| ).toDF("id", "Operation","ViewName","DiectoryName","Query")
df: org.apache.spark.sql.DataFrame = [id: int, Operation: string ... 3 more fields]
scala> df.show()
+---+---------+-----------------+-------------------+--------------------+
| id|Operation| ViewName| DiectoryName| Query|
+---+---------+-----------------+-------------------+--------------------+
| 0| Load| employeeview|employee.empdetails| null|
| 1| Query|employeecountview| null|select count(*) f...|
| 2| store|employeecountview| null| null|
+---+---------+-----------------+-------------------+--------------------+
scala> val dfcount = df.count().toInt
dfcount: Int = 3
scala> :paste
// Entering paste mode (ctrl-D to finish)
for( a <- 0 to dfcount-1){
val operation = df.filter(s"id=${a}").select("Operation").as[String].first
operation match {
case "Query" => println("matching Query") // or call a function here for Query()
case "Load" => println("matching Load") // or call a function here for Load()
case "store" => println("matching store") //
case x => println("matched " + x )
}
}
// Exiting paste mode, now interpreting.
matching Load
matching Query
matching store
scala>