将 Scala 可变数组转换为 spark 数据框
Converting Scala mutable arrays to a spark dataframe
我定义了三个可变数组:
import scala.collection.mutable.ArrayBuffer
var quartile_1 = ArrayBuffer[Double]()
var quartile_3 = ArrayBuffer[Double]()
var id = ArrayBuffer[String]()
quartile_1 和 quartile_3 是 id 级别的信息,我目前将它们计算为:
def func1(x: org.apache.spark.sql.Row) {
val apQuantile = df_auth_for_qnt.where($"id" === x(0).toString).stat.approxQuantile("tran_amt", Array(0.25, 0.75), 0.001)
quartile_1 += apQuantile(0)
quartile_3 += apQuantile(1)
id += x(0).toString()
}
val cardNumList = df_auth_for_qnt_gb.where($"tran_cnt" > 8).select("card_num_1").collect.foreach(func1)
有没有比将它们附加到可变数组更好的方法?我的目标是将分位数数据 id 作为数据框提供 - 这样我就可以进行进一步的连接。
像 ArrayBuffer
这样的可变结构是邪恶的,尤其是在可并行化的上下文中。在这里可以很容易地避免它们。
func1
可以return一个(String, Array[Double])
的元组,其中第一个元素对应id(以前的id
缓冲区),第二个元素是四分位数return来自 approxQuantile
:
def func1(x: Row): (String, Array[Double]) = {
val cardNum1 = x(0).toString
val quartiles = df_auth_for_qnt.where($"id" === cardNum1).stat.approxQuantile("tran_amt", Array(0.25, 0.75), 0.001)
(cardNum1, quartiles)
}
现在,使用函数转换我们可以获得一个不可变的结果结构。
作为数据框:
val resultDf = df_auth_for_qnt_gb.where($"tran_cnt" > 8).select("card_num_1").map(func1).toDF("id", "quartiles")
或者作为 Map[String, Array[Double]]
具有与元组相同的关联 return 来自 func1
:
val resultMap = df_auth_for_qnt_gb.where($"tran_cnt" > 8).select("card_num_1").map(func1).collect().toMap
我定义了三个可变数组:
import scala.collection.mutable.ArrayBuffer
var quartile_1 = ArrayBuffer[Double]()
var quartile_3 = ArrayBuffer[Double]()
var id = ArrayBuffer[String]()
quartile_1 和 quartile_3 是 id 级别的信息,我目前将它们计算为:
def func1(x: org.apache.spark.sql.Row) {
val apQuantile = df_auth_for_qnt.where($"id" === x(0).toString).stat.approxQuantile("tran_amt", Array(0.25, 0.75), 0.001)
quartile_1 += apQuantile(0)
quartile_3 += apQuantile(1)
id += x(0).toString()
}
val cardNumList = df_auth_for_qnt_gb.where($"tran_cnt" > 8).select("card_num_1").collect.foreach(func1)
有没有比将它们附加到可变数组更好的方法?我的目标是将分位数数据 id 作为数据框提供 - 这样我就可以进行进一步的连接。
像 ArrayBuffer
这样的可变结构是邪恶的,尤其是在可并行化的上下文中。在这里可以很容易地避免它们。
func1
可以return一个(String, Array[Double])
的元组,其中第一个元素对应id(以前的id
缓冲区),第二个元素是四分位数return来自 approxQuantile
:
def func1(x: Row): (String, Array[Double]) = {
val cardNum1 = x(0).toString
val quartiles = df_auth_for_qnt.where($"id" === cardNum1).stat.approxQuantile("tran_amt", Array(0.25, 0.75), 0.001)
(cardNum1, quartiles)
}
现在,使用函数转换我们可以获得一个不可变的结果结构。
作为数据框:
val resultDf = df_auth_for_qnt_gb.where($"tran_cnt" > 8).select("card_num_1").map(func1).toDF("id", "quartiles")
或者作为 Map[String, Array[Double]]
具有与元组相同的关联 return 来自 func1
:
val resultMap = df_auth_for_qnt_gb.where($"tran_cnt" > 8).select("card_num_1").map(func1).collect().toMap