我使用Spark SQL加载大型CSV文件,并将它们连接到一个公共列上。在代码中执行联接后,我想将表保存回一个新的CSV文件。我使用DataFrame的write()
方法来完成此操作。在检查文件时,我惊讶地看到标题被打印了多次,后面是数据,后面是更多的标题。例如:
name, age, addr, job, salary
name, age, addr, job, salary
name, age, addr, job, salary
Bob, 34, 123 Fake St, Programmer, 10000000
June, 23, 5 Tree Ave., College Student, 15000
Rick, 12, 43 Ware St., Student, 0
name, age, addr, job, salary
name, age, addr, job, salary
name, age, addr, job, salary
<more data here>
这个输出是出乎意料的,尤其是因为DataFrame类的show()
方法将表打印到控制台并显示我所期望的内容。
我用来执行写入的代码:
bigTable.write().mode(SaveMode.Overwrite).format("com.databricks.spark.csv")
.option("header", "true").save(settings.getValue().outputDir +"/bigTable.csv");
使用设置option("header", "false")
时,数据值将正确保存在CSV中。这是个虫子吗?
我相信我已经通过使用partition()
和coalesce()
函数找到了一个解决方案:
bigTable.repartition(1).coalesce(1).write().format("com.databricks.spark.csv").option("header", "true").save("myoutputfile.csv");
添加这些调用后,CSV文件将具有我所期望的输出。