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|
+-------+----------+----------+----------+----------+----------+----------+-----------------+
我希望答案对您有所帮助,并且应该让您对应该如何进行的工作有更多的了解。
我有如下 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|
+-------+----------+----------+----------+----------+----------+----------+-----------------+
我希望答案对您有所帮助,并且应该让您对应该如何进行的工作有更多的了解。