Spark:将DataFrame写入CSV时出错

时间:2018-06-21 07:30:08

标签: java apache-spark apache-spark-sql hdfs spark-csv

我正在尝试使用Databricks的spark-csv_2.10依赖关系将数据帧写入* .csv文件到HDFS。由于我能够将.csv文件读取到DataFrame,因此该依赖项似乎运行良好。但是当我执行写操作时,出现以下错误。将标头写入文件后,就会出现异常。

18/06/21 21:41:58 WARN hdfs.DFSClient: Caught exception
java.lang.InterruptedException
at java.lang.Object.wait(Native Method)
at java.lang.Thread.join(Thread.java:1281)
at java.lang.Thread.join(Thread.java:1355)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.closeResponder(DFSOutputStream.java:967)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.endBlock(DFSOutputStream.java:705)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:894)

这是我使用的代码的简化版本

DataFrame df = sqlContext.read().format("com.databricks.spark.csv")
                        .option("header", "true")
                        .option("inferSchema", "true")
                        .option("delimiter", "|")
                        .load("/user/abc/data.csv");
df.registerTempTable("empTable");
DataFrame result = sqlContext.sql("SELECT department, avg(salary) as avgSalary FROM empTable GROUP BY department").cache();
result.write()
      .format("com.databricks.spark.csv")
      .option("header", "true")
      .save("/user/abc/csv/"); //InterruptedException comes here
//The directory "/user/abc/csv/" gets created and it even has temp files.

当我将查询更改为SELECT department, salary FROM empTable时,写入工作正常。

有人可以帮我吗?

编辑:根据Chandan的要求,这是result.show();

的结果
+----------+---------+
|department|avgSalary|
+----------+---------+
|   Finance|   5000.0|
|    Travel|   5000.0|
+----------+---------+

我使用Spark 1.6.0和spark-csv_2.10:1.5.0

2 个答案:

答案 0 :(得分:0)

是要写入的UNIX文件系统还是HDFS。我可以执行以上代码。您是否可以看到结果DataFrame。尝试result.show并在此处发布结果。将检查是什么问题。如果可能的话,请发布完整的日志

尝试将其保存在镶木地板中,然后查看其是否有效。如果它可以正常工作,那么csv必须存在一些问题,我们可以检查一下。它为我工作。在spark 2.2和1.6.3中尝试查询的问题没有问题。尝试在本地UNIX文件系统中写入。我认为这可能与HDFS有关。您的代码似乎正确

答案 1 :(得分:0)

您可以忽略此警告。这是Hadoop中的错误。

有一个问题:https://issues.apache.org/jira/browse/HDFS-10429