我正在尝试基于accountId
对输入文件进行分区。但是,只有当dataFrames包含超过1000条记录时,才会执行此分区。 accountId
是一个动态整数,不可能是未知的。请考虑以下代码
val ssc = new StreamingContext(sc, Seconds(2))
val lines = ssc.textFileStream("input")
lines.print()
lines.foreachRDD { rdd =>
val count = rdd.count()
if (count > 0) {
val df = sqlContext.read.json(rdd)
val filteredDF = df.filter(df("accountId")==="3")
if (filteredDF.count() > 1000) {
df.write.partitionBy("accountId").format("json").save("output")
}
}
}
ssc.start()
ssc.awaitTermination()
但是上面的代码会对所有不需要的accountId进行分区。
accountId
的计数。例如,如果输入文件包含1500个accountId = 1的记录和10个accountId = 2的记录,则将基于accountId = 1的过滤数据帧分区为输出源,并在memmory中保留accountId = 2个记录。
如何使用spark-streaming实现这一目标?
答案 0 :(得分:1)
你应该做什么
filteredDF.write.partitionBy("accountId").format("json").save("output")
而不是
df.write.partitionBy("accountId").format("json").save("output")