我正在开发一个场景,我需要从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文件?
解决方案有效,但是!
我找到了解决此问题的方法。我创建了一个shell包装器,我使用以下方法将.lzo解压缩成.avro文件格式:
hadoop fs -text <file_path>*.lzo | hadoop fs - put - <file_path>.avro
我成功解压缩lzo文件,但问题是我至少有5000个压缩格式的文件。解压缩和逐个转换需要将近1个多小时才能运行此作业。
有没有办法以批量方式进行减压?
再次感谢!