【问题标题】:Spark: Error While Writing DataFrame to CSVSpark:将 DataFrame 写入 CSV 时出错
【发布时间】:2018-11-30 10:44:07
【问题描述】:

我正在尝试使用 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

【问题讨论】:

  • 您使用的是哪个版本的 Spark?
  • 你有权限写入代码中使用的HDFS目录吗?
  • 你可以使用 save("/user/abc/csv/test");而不是 save("/user/abc/csv/");
  • @PhaniKumarYadavilli 这会有什么不同吗?因为 /csv 和 /test 都是目录。另外,当我更改 SQLContext.sql() 运行的查询时,相同的路径也可以正常工作
  • 通常,代码应该可以工作。因为当我在本地尝试时,您的代码运行良好。要么您有权限问题,要么它可能被视为一些格式错误的 URI。

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


【解决方案1】:

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

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

【讨论】:

  • 它部分工作。它写入 csv 文件,但只设法写入标题,然后在写入数据之前获取 InterruptedException。异常被捕获,并再次尝试使用新文件。同样,在编写标题之后出现异常。我将option("header", "true") 更改为false 并且异常不再出现。但是大约有 200 个文件,其中只有 2 个有数据。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 2018-11-27
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    相关资源
    最近更新 更多