Spark scala中基于json对象参数的调用方法?

Calling method based on json object parameter in Spark scala?

我有如下 JSON 个对象..

{"name":"method1","parameter1":"P1","parameter2":"P2","parameter3":"P3","parameter4":"P4"}

{"name":"method2","parameter1":"P1","parameter2":"P2","parameter3":"P3","parameter4":"P4","parameter5":"P5","parameter6":"P6"}

我有不同的功能和不同的逻辑,如下所示

def method1(P1:String, P2:Int, P3:String, P4:String)={
  println(p1)
  println(p2)
  println(p3)
  println(p4)
} 

def method2(P1:String, P2:Int, P3:String, P4:String,P5:String,P6:String)={
  println(p1)
  println(p2)
  println(p3)
  println(p4)
  println(p6)
  println(p5)
} 

使用这个对象我必须调用我的方法。

例如,我的 JSON 对象包含第一个参数 method1,然后我必须调用第一个函数(如 method1(P1: String, P2: Int, P3: String, P4: String) ),并将扩孔属性作为参数。

根据我的 JSON 第一个参数,我用其余参数调用了这个函数。 请让我知道我怎样才能做到这一点?

这是使用 dataframe 的解决方案。

您有一个有效的 json 格式,可以通过 spark 读取到 dataframe

val df = sqlContext.read.json("path to the json file")

应该给你 dataframe 作为

+-------+----------+----------+----------+----------+----------+----------+
|name   |parameter1|parameter2|parameter3|parameter4|parameter5|parameter6|
+-------+----------+----------+----------+----------+----------+----------+
|method1|P1        |P2        |P3        |P4        |null      |null      |
|method2|P1        |P2        |P3        |P4        |P5        |P6        |
+-------+----------+----------+----------+----------+----------+----------+

现在我已经通过将 primitive datatypes 更改为 column 并将 printing 更改为 [=36] 来修改您的两个函数=]连接 个字符串。

import org.apache.spark.sql.Column
import org.apache.spark.sql.functions._
def method1(P1:Column, P2:Column, P3:Column, P4:Column)={
  concat_ws(",", P1, P2, P3, P4)
}

def method2(P1:Column, P2:Column, P3:Column, P4:Column,P5:Column,P6:Column)={
  concat_ws(",", P1, P2, P3, P4, P5, P6)
}

您可以使用 when 函数根据 name 列中填充的值调用这两种方法,如下所示

df.withColumn("methodCalling", when($"name" === "method1", method1($"parameter1",$"parameter2",$"parameter3",$"parameter4"))
  .otherwise(when($"name" === "method2", method2($"parameter1",$"parameter2",$"parameter3",$"parameter4",$"parameter5",$"parameter6"))))
  .show(false)

哪个应该给你

+-------+----------+----------+----------+----------+----------+----------+-----------------+
|name   |parameter1|parameter2|parameter3|parameter4|parameter5|parameter6|methodCalling    |
+-------+----------+----------+----------+----------+----------+----------+-----------------+
|method1|P1        |P2        |P3        |P4        |null      |null      |P1,P2,P3,P4      |
|method2|P1        |P2        |P3        |P4        |P5        |P6        |P1,P2,P3,P4,P5,P6|
+-------+----------+----------+----------+----------+----------+----------+-----------------+

我希望答案对您有所帮助,并且应该让您对应该如何进行的工作有更多的了解。