如何基于dataFram中的行计数对列值

时间:2016-07-29 12:46:50

标签: scala apache-spark spark-streaming apache-spark-1.6

我正在尝试基于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进行分区。

  1. 我想在数据框中找到每个accountId的计数。
  2. 如果每个accountId的记录超过1000,则将分区信息写入输出源。
  3. 例如,如果输入文件包含1500个accountId = 1的记录和10个accountId = 2的记录,则将基于accountId = 1的过滤数据帧分区为输出源,并在memmory中保留accountId = 2个记录。

    如何使用spark-streaming实现这一目标?

1 个答案:

答案 0 :(得分:1)

你应该做什么

filteredDF.write.partitionBy("accountId").format("json").save("output")

而不是

df.write.partitionBy("accountId").format("json").save("output")