我正在对火花数据帧执行一个非常重要的计数键,对于分区超过180个分区的6k记录,需要花费太多时间~7到8秒。我可以看到80%的时间用于序列化和随机播放,计算时间非常短。
val df = jdbcTable.filter($"COL" === "FILTER_CONDITION")
.map(row => ((row.getInt(0), row.getString(1)), s"${row.getInt(0)},${row.getString(1)},${row.getLong(2)},${row. /*getDecimal*/ getString(3)},${row.getString(4)}"))
.toDF("COL1", "Message")
val df2 = tranformKeyedDF(df,df.select($"COL1").distinct.count)
def tranformKeyedDF(keyedDF: DataFrame, repartitionCount: Int) =
{
import keyedDF.sqlContext.implicits._
val df = keyedDF match {
case keyedDF if (!keyedDF.rdd.isEmpty()) =>
{
val repartitionedDF = keyedDF.repartition(repartitionCount, $"Col1")
.select($"Message")
.select(expr("(split(Message, ','))[0]").cast("Int").as("Tag1"),
expr("(split(Message, ','))[1]").cast("String").as("Tag2"),
expr("(split(Message, ','))[2]").cast("Long").as("Tag3"),
expr("(split(Message, ','))[3]").cast("String").as("Tag4"),
expr("(split(Message, ','))[4]").cast("String").as("Tag5"))
.sortWithinPartitions($"Tag3", $"Tag4")
repartitionedDF
}
case keyedDF if (keyedDF.rdd.isEmpty()) =>
{
val repartitionedDF = keyedDF.repartition(1, $"Col1")
.select($"Message")
.select(expr("(split(Message, ','))[0]").cast("Int").as("Tag1"),
expr("(split(Message, ','))[1]").cast("String").as("Tag2"),
expr("(split(Message, ','))[2]").cast("Long").as("Tag3"),
expr("(split(Message, ','))[3]").cast("String").as("Tag4"),
expr("(split(Message, ','))[4]").cast("String").as("Tag5"))
repartitionedDF
}
}
df
}
是否有更好的API可用于计算数据帧上的不同键,并且在延迟方面具有较少的随机性。我正在使用spark 1.6。