Spark - Avro读取架构但DataFrame为空

时间:2016-07-07 17:05:06

标签: apache-spark apache-spark-sql spark-dataframe avro spark-avro

我正在使用Gobblin定期从Oracle提取关系数据,将其转换为avro并将其发布到HDFS

我的dfs目录结构如下所示

-tables
  |
  -t1
   |
   -2016080712345
    |
    -f1.avro
   |
   -2016070714345
    |
    -f2.avro

我试图像这样阅读:

val sq = sqlContext.read.format("com.databricks.spark.avro")
  .load("/user/username/gobblin/job-output/tables/t1/")

当我运行printSchema时,我可以看到架构被正确解释。

但是,当我运行countshow时,DataFrames为空。我已通过将其转换为.avro

来验证JSON个文件不为空
java -jar avro-tools-1.7.7.jar  tojson --pretty t1/20160706230001_append/part.f1.avro > t1.json

我怀疑它可能与目录结构有关。也许Spark avro库只从.avro文件的根目录下来一层。日志似乎表明驱动程序中只列出了t1下的目录:

  

16/07/07 10:47:09 INFO avro.AvroRelation:列出hdfs://myhost.mydomain.com:8020 / user / username / gobblin / job-output / tables / t1 on driver

     

16/07/07 10:47:09 INFO avro.AvroRelation:列出hdfs://myhost.mydomain.com:8020 / user / username / gobblin / job-output / tables / t1 / 20160706230001_append on driver

有没有人经历过类似的事情,或者知道如何解决这个问题?我必须指向低于t1目录,因为名称是由时间戳生成的。

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。虽然我不知道问题的确切原因,但有办法解决这个问题:

不使用指向父目录,而是使用通配符并指向avro文件级别。

sqlContext.read.format("com.databricks.spark.avro")\
    .load("/path/to/tables/t1/*/*.avro")