注意:我不能切换到结构化流,因为它不支持我正在使用的某些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 {}内部创建。