将2个scala sparkDataframe和一个长值转换为单个json字符串

jjjwad0x  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(446)

我在scala/spark数据管道中有3个对象。2是Dataframe,1是长值。
我需要创建一个包含这3个对象的json对象。
例如,如果将特定日期作为请求传递给应用程序api:

val df1 = getDF_1(date)
val df2 = getDF_2(date)
val value_3 = getValue_3(date)

我可以将这些单独转换为json,但我花了很多时间来创建一个单独的json响应,如:

response = {"date":date, "values"{
                                  "df1":{nested json report}
                                  "df2":{nested json report}
                                  "long3":23234
                                 }
             }

这是创建Dataframe的方式:

case class IpAccessCount(ip:String, uri:String, accessCount:Long)
    def toIpAccessCount(ip:String, uri:String, accessCount:Long): IpAccessCount = IpAccessCount(ip, uri,accessCount)
    val ipAccessCount=udf(toIpAccessCount _)
    spark.udf.register("ipAccessCount", ipAccessCount)

    val ipAccessCountByDate = spark.sql("""select ip, uri, datetime, count(*) as accessCount from csvData group by ip, uri, datetime """)
    ipAccessCountByDate.createOrReplaceTempView("ipAccessCountByDate")
    def GetDateIpAccessCount(date_as_str:String)= 
    ipAccessCountByDate.filter(col("datetime")===s"$date_as_str").drop("datetime").map(r => toIpAccessCount(r.getString(0), r.getString(1), r.getLong(2))).toDF().coalesce(1)

我不知道如何将它们合并到一个json响应中。谢谢!

y4ekin9u

y4ekin9u1#

我有一个解决办法,如果你真的要实施这种方式。

val df1 = "[" + getDF_1(date).toJSON.collect().mkString(",") + "]"
val df2 = "[" + getDF_2(date).toJSON.collect().mkString(",") + "]"
val value_3 = getValue_3(date)

val json_response = s"""
      |{"date":"${date}", "values":{
      |                                  "df1":"${df1}",
      |                                  "df2":"${df2}",
      |                                  "long3":23234
      |                                 }
      |             }
      |""".stripMargin

说明:让我们创建df1和df2的json数组字符串。然后将df1、df2、date作为一个json字符串附加到json\u响应中,您可以根据需要将这个字符串转换成json对象。
注意:如果在df1或df2中有大量数据,就像在collect()中一样,可能会出现内存不足异常。

相关问题