Spark DataFrame中的延迟问题明显不计

时间:2017-09-13 06:27:08

标签: scala hadoop apache-spark spark-dataframe

我正在对火花数据帧执行一个非常重要的计数键,对于分区超过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

    }

enter image description here

是否有更好的API可用于计算数据帧上的不同键,并且在延迟方面具有较少的随机性。我正在使用spark 1.6。

0 个答案:

没有答案