使用foreachrdd()后如何制作DStream?

时间:2018-08-04 17:32:07

标签: scala apache-spark dataframe spark-streaming apache-spark-mllib

注意:我不能切换到结构化流,因为它不支持我正在使用的某些MLLib组件(KMeans,矢量化器等)(如果我错了,请纠正我)

我知道DStream包含RDD,但是我需要将这些RDD转换为Dataframe,对这些Dataframe进行一些工作,然后再将其转换回RDD的DStream。这就是我所拥有的。

someDstream.map{ item =>
  // turning them into rows with some column headers
  Row(item._2._2("content"), 
      item._2._2("published_date"))
}.foreachRDD { rdd =>

  // turning each RDD into Dataframes
  val spark = SparkSession.builder().getOrCreate()
  val df = spark.createDataFrame(rdd,
    new StructType()
      .add("content", StringType)
      .add("published_date", StringType))

  val tokenizer: Tokenizer = new Tokenizer()
    .setInputCol("content")
    .setOutputCol("tokens_raw")

  val remover = new StopWordsRemover()
    .setInputCol("tokens_raw")
    .setOutputCol("tokens")
    .setStopWords(lisOfStopWords)
    .setCaseSensitive(false)

  val tokenized: DataFrame = tokenizer.transform(df)
  val filtered: DataFrame = remover.transform(tokenized)

  // I have an existing word2vec model, that I'd like to transform on
  // each BATCH of data (so each RDD I think). The transform only works 
  // on DATAFRAMES, and creates a new column of Vectors
  val featurizedData = word2vecModel.transform(filtered)

   ....
  }

现在,我需要将这些向量流馈送到仅接受DStream [RDD]的StreamingKMeans模型中,但是在调用foreachrdd()之后,我似乎无法“返回”到DStream。因此,基本上,我需要将数据帧块转换回RDD块,然后继续进行,就好像我一直在DStream中一样。我无法在.map {}内部创建数据框,但可以在.foreachrdd {}内部创建。

0 个答案:

没有答案