SPARK踩坑之广播流出现空指针

知识点:

1,创建新ROW
2, ROW新增字段
3,广播

出现的问题

1,广播流后,使用流时出现空指针异常,不知具体原因是什么,改用先将流collect后再广播,就正常了。
2,流不能嵌套使用。不能再factDF中直接使用pairDF

package spark

import org.apache.spark.broadcast.Broadcast
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.catalyst.encoders.RowEncoder
import org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema
import org.apache.spark.sql.functions.col
import org.apache.spark.sql.types.{DateType, DoubleType, StringType, StructField, StructType}
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.{DataFrame, DataFrameReader, Dataset, Encoders, Row, SparkSession}

import java.sql.Date

object SparkGeektime02_2 {
  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName(this.getClass.getSimpleName)
    val session: SparkSession = SparkSession.builder()
      .master("local[*]")
      .appName(this.getClass.getSimpleName)
      .getOrCreate()

    val sc: SparkContext = session.sparkContext
    sc.setLogLevel("warn")

    val pairDF: DataFrame = session
      .read
      .option("sep", ",")
      .option("dateFormat", "yyyy-MM-dd")
      .schema("startDate date, endDate date")
      .csv("D:\\hadoop笔记\\hbase\\code\\scalaStudy\\data\\input\\datesintervers.txt")

    val factDF: DataFrame = session.read
      .option("sep", ",")
      .option("dateFormat", "yyyy-MM-dd")
      .schema("dim1 string, dim2 string, dim3 string, eventDate date, value double")
      .csv("data/input/sales.txt")


    pairDF.show()
    factDF.show

    val rows: Array[Row] = pairDF.collect()
    val pairDFBrod = session.sparkContext.broadcast(rows)

    //  如下广播流会导致在使用时报空指针异常
//    val pairDFBrod: Broadcast[DataFrame] = session.sparkContext.broadcast(pairDF)

    val encoder =
      RowEncoder(
        StructType(Seq(
          StructField("dm1", StringType),
          StructField("dm2", StringType),
          StructField("dm3", StringType),
          StructField("eventDate", DateType),
          StructField("value", DoubleType),
          StructField("rangeDate", StringType)
        ))
      )

    val resultDS: Dataset[Row] = factDF.mapPartitions(
      it => {
        var newSchema: StructType = null
        it.map(
          factRow => {
            var outRow: Row = null
            if (newSchema == null) {
                 newSchema = factRow.schema.add("dateRange", StringType)
            }

            pairDFBrod.value.foreach(
              row => {
                val eventDate: Date = factRow.getDate(3)
                val startDate: Date = row.getDate(0)
                val endDate: Date = row.getDate(1)

                if (eventDate.compareTo(startDate) >= 0 && eventDate.compareTo(endDate) <=0) {
                  val buffer = Row.unapplySeq(factRow).get.toBuffer
                  buffer.append(startDate.toString+endDate.toString)
                  factRow.copy()

                  outRow = new GenericRowWithSchema(buffer.toArray,newSchema)

                }
            })
            outRow
          }
        )
      }
    )(encoder)


    import org.apache.spark.sql.functions._
    val frame: DataFrame = resultDS.toDF()
      .groupBy("dm1", "dm2", "dm3", "rangeDate")
      .agg(sum("value") as "sum_value")
      .select("sum_value", "dm1", "dm2", "dm3", "rangeDate")

    frame.show()



    resultDS.show()


  }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
spark streaming 是基于 spark 引擎的实时数据处理框架,可以通过集成 kafka 来进行数据的处理。然而,在使用 spark streaming 进行 kafka 数据处理时,可能会遇到一些。 首先,要注意 spark streaming 和 kafka 版本的兼容性。不同版本的 spark streaming 和 kafka 可能存在一些不兼容的问题,所以在选择版本时要特别留意。建议使用相同版本的 spark streaming 和 kafka,以避免兼容性问题。 其次,要注意 spark streaming 的并行度设置。默认情况下,spark streaming 的并行度是根据 kafka 分区数来决定的,可以通过设置 spark streaming 的参数来调整并行度。如果并行度设置得过高,可能会导致任务处理过慢,甚至出现 OOM 的情况;而设置得过低,则可能无法充分利用集群资源。因此,需要根据实际情况进行合理的并行度设置。 另外,要注意 spark streaming 和 kafka 的性能调优。可以通过调整 spark streaming 缓冲区的大小、批处理时间间隔、kafka 的参数等来提高性能。同时,还可以使用 spark streaming 的 checkpoint 机制来保证数据的一致性和容错性。但是,使用 checkpoint 机制可能会对性能产生一定的影响,所以需要权衡利弊。 最后,要注意处理 kafka 的消息丢失和重复消费的问题。由于网络或其他原因,可能会导致 kafka 的消息丢失;而 spark streaming 在处理数据时可能会出现重试导致消息重复消费的情况。可以通过配置合适的参数来解决这些问题,例如设置 KafkaUtils.createDirectStream 方法的参数 enable.auto.commit,并设置适当的自动提交间隔。 总之,在使用 spark streaming 进行 kafka 数据处理时,需要留意版本兼容性、并行度设置、性能调优和消息丢失重复消费等问题,以免

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小手追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值