我从包含商店信息和销售信息的两个不同API端点处理JSON的最初方法是:将每个商店的JValue(struct)与相应的销售JValue(包含销售数组)连接。然后,我创建了一个DataFrame并分解了Sales数组,以便以后可以从中选择数据。
val salesDf: DataFrame = salesRawDf.select($"stores", explode($"sales").as("sl"))
.select($"stores.id", $"stores.name", $"sl.id", $"sl.current_sales", $"sl.review")
但是现在看来,爆炸会导致巨大的开销,并且在运行Spark作业时我得到OutOfMemoryError: Java heap space
。
因此,我决定在并行执行之前修改逻辑并解析连接JValues的地方的销售额。
使用json4s解析JSON时,上述exploding
销售数组的相似之处是什么?现在,我以这种方式连接商店和销售:
def mergeSales(storeJValue: JValue): String = {
val salesJValue: JValue = parse(rawJson)
val store = compact(render(storeJValue))
val sales = compact(render(salesJValue))
val mergedSales: String = s"""{"store":$store,"sales":$sales}"""
mergedSales
}