1

我正在处理一个需要从 HDFS 读取 Avro 容器文件并使用 Spark 进行分析的场景。

输入文件目录: hdfs: ///user/learner/20151223/.lzo*

注意:输入 Avro 文件是 lzo 压缩的。

val df = sqlContext.read.avro("/user/learner/20151223/*.lzo");

当我运行上面的命令时,它会抛出一个错误:

java.io.FileNotFoundException: No avro files present at file:/user/learner/20151223/*.lzo
at com.databricks.spark.avro.AvroRelation$$anonfun$11.apply(AvroRelation.scala:225)
at com.databricks.spark.avro.AvroRelation$$anonfun$11.apply(AvroRelation.scala:225)
at scala.Option.getOrElse(Option.scala:120)
at com.databricks.spark.avro.AvroRelation.newReader(AvroRelation.scala:225)

这是有道理的,因为方法 read.avro() 期望 .avro 扩展文件作为输入。所以我提取输入的 .lzo 文件并将其重命名为 .avro。我能够正确读取 avro 文件中的数据。

有没有办法在 spark 中读取 lzo 压缩的 Avro 文件?

解决方案有效,但是!

我找到了解决这个问题的方法。我创建了一个外壳包装器,其中我使用以下方式将 .lzo 解压缩为 .avro 文件格式:

hadoop fs -text <file_path>*.lzo | hadoop fs - put - <file_path>.avro

我成功地解压了 lzo 文件,但问题是我有至少 5000 个压缩格式的文件。解压缩和逐个转换需要将近 1 个多小时才能运行此作业。

有什么办法可以批量解压吗?

再次感谢 !

4

0 回答 0