Преобразование 2 Scala кадров данных Spark и длинного значения в одну строку JSON - PullRequest
0 голосов
/ 06 августа 2020

У меня есть 3 объекта в конвейере данных scala / spark. 2 - фреймы данных, а 1 - длинное значение.

Мне нужно создать один json объект, который включает 3 объекта.

Например, если передать конкретную дату в 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
                                 }
             }

Вот как фреймы данных создаются:

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 ответ. Большое спасибо!

1 Ответ

0 голосов
/ 06 августа 2020

У меня есть решение, если вам действительно нужно реализовать этот способ.

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

Объяснение: Давайте создадим JSON строку массива как для df1, так и для df2. Затем добавьте df1, df2, date как строку json в json_response, вы можете преобразовать эту строку в объект JSON, если необходимо.

Примечание: если у вас есть огромные данные в df1 или df2, как вы ' при выполнении функции collect () вы можете получить исключение нехватки памяти.

...