【问题标题】:How to save streaming aggregation in Complete output mode to Parquet?如何将完整输出模式下的流聚合保存到 Parquet?
【发布时间】:2018-03-07 07:55:45
【问题描述】:

我已使用完整模式对流式数据帧应用聚合。为了将数据框保存在本地,我实现了foreach sink。我能够以文本形式保存数据框。但我需要以 Parquet 格式保存。

val writerForText = new ForeachWriter[Row] {
    var fileWriter: FileWriter = _

    override def process(value: Row): Unit = {
      fileWriter.append(value.toSeq.mkString(","))
    }

    override def close(errorOrNull: Throwable): Unit = {
      fileWriter.close()
    }

    override def open(partitionId: Long, version: Long): Boolean = {
      FileUtils.forceMkdir(new File(s"src/test/resources/${partitionId}"))
      fileWriter = new FileWriter(new File(s"src/test/resources/${partitionId}/temp"))
      true

    }
  }

val columnName = "col1"
frame.select(count(columnName),count(columnName),min(columnName),mean(columnName),max(columnName),first(columnName), last(columnName), sum(columnName))
              .writeStream.outputMode(OutputMode.Complete()).foreach(writerForText).start()

我怎样才能做到这一点? 提前致谢!

【问题讨论】:

标签: scala apache-spark parquet spark-structured-streaming


【解决方案1】:

为了将数据帧保存在本地,我实现了 foreach 接收器。我能够以文本形式保存数据框。但我需要以镶木地板格式保存它。

保存流式数据集时的默认格式是...parquet。话虽如此,您不必使用相当先进的foreach 接收器,而只需使用parquet

查询可能如下:

scala> :type in
org.apache.spark.sql.DataFrame

scala> in.isStreaming
res0: Boolean = true

in.writeStream.
  option("checkpointLocation", "/tmp/checkpoint-so").
  start("/tmp/parquets")

【讨论】:

  • 结构化流不允许我们以完整模式将数据帧写入任何接收器,除了内存。为了保存它,我们必须实现 foreach sink。我们无法在您建议的完整模式下执行此操作。
  • 哎哟......你可能是对的......太着急回答这个问题了。让我想想……
  • @MaheshChandKandpal 由于您的接收器是一个文件,因此在 Jacek 的回答中使用带有附加模式的 File Sink 是有意义的。您使用 Foreach Sink 的解决方案似乎被过度考虑了
  • 我需要以完整模式计算并以覆盖模式保存。
  • 如果您尝试执行此操作,您会收到 IllegalArgumentException 说“数据源拼花不支持完整输出模式”。
猜你喜欢
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 2018-04-25
  • 2017-11-08
  • 2011-07-01
相关资源
最近更新 更多