【问题标题】:How do I write a dataset which contains only header (no rows) into a hdfs location (csv format) such that it contains the header when downloaded?如何将仅包含标题(无行)的数据集写入 hdfs 位置(csv 格式),以便在下载时包含标题?
【发布时间】:2018-01-19 00:44:19
【问题描述】:

我有一个仅包含标题(id、name、age)和 0 行的数据集。 我想将其作为 csv 文件写入 hdfs 位置,使用

DataFrameWriter dataFrameWriter = dataset.write();
Map<String, String> csvOptions = new HashMap<>();
csvOptions.put("header", "true");
dataFrameWriter = dataFrameWriter.options(csvOptions);
dataFrameWriter.mode(SaveMode.Overwrite).csv(location);

在 hdfs 位置,文件是:

1. _SUCCESS
2. tempFile.csv

如果我去那个位置并下载文件 (tempFile.csv) ,我会得到一个空的 csv 文件。 已尝试使用标头 true 和 false 。 如何将标头写入 csv 文件的内容?

【问题讨论】:

  • 你的数据集是有 0 行还是 1 行包含标题?
  • 当我执行 dataset.collect() 时,它给出了 0 行。但是数据集有模式详细信息,它是创建此数据集的 csv 文件的标头。
  • 确实,在将空数据集写入csv时,似乎没有写入headers。

标签: java csv hadoop apache-spark apache-spark-dataset


【解决方案1】:

嗯,这是一种解决方法。在 Scala 中,您可以执行以下操作:

df.take(1).isEmpty match {

    case true => sc.parallelize(Array(df.schema.map(_.name).mkString(",")))
                .saveAsTextFile("temp")
    case false => df.write.save("temp")

}

df.schema 将数据帧df 的架构返回为StructType

_.name 返回架构中每一列的名称。

mkString(",") 将名称的结果序列转换为逗号分隔的字符串

我猜,Java 也可以做类似的事情。

【讨论】:

  • 我们必须得到列名,创建一个字符串然后保存。你认为这是火花端的错误吗?
  • @Echo 我不会称其为错误,因为您尝试编写的数据框是空的,不适合作为一般情况的要求。我们只是说你的情况是一个特殊情况,而不是称之为错误。
【解决方案2】:

如果你看代码,你会发现只有在至少有一行的情况下才写入表头。

UnivocityGenerator.scala

  def write(row: InternalRow): Unit = {
    if (printHeader) {
      gen.writeHeaders()
    }
    gen.writeRow(convertRow(row): _*)
    printHeader = false
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 2010-12-29
    相关资源
    最近更新 更多