2

我正在使用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我可以看到模式被正确解释。

但是,当我运行countor时show,它们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 信息 avro.AvroRelation:在驱动程序上列出 hdfs://myhost.mydomain.com:8020/user/username/gobblin/job-output/tables/t1

16/07/07 10:47:09 信息 avro.AvroRelation:在驱动程序上列出 hdfs://myhost.mydomain.com:8020/user/username/gobblin/job-output/tables/t1/20160706230001_append

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

4

1 回答 1

0

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

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

sqlContext.read.format("com.databricks.spark.avro")\
    .load("/path/to/tables/t1/*/*.avro")
于 2016-10-26T21:31:04.897 回答