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, я вижу, что схема интерпретируется правильно.

Однако, когда я запускаю count или 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 INFO avro.AvroRelation: Listing hdfs: //myhost.mydomain.com: 8020 / user / username / gobblin / job-output / tables / t1 на драйвере

16/07/07 10:47:09 INFO avro.AvroRelation: Listing hdfs: //myhost.mydomain.com: 8020 / user / username / gobblin / job-output / tables / t1 / 20160706230001_append для драйвера

Кто-нибудь испытывал нечто подобное или знает, как это обойти? Я бы не стал указывать ниже, чем каталог t1, потому что имена генерируются меткой времени.


person Brian    schedule 07.07.2016    source источник


Ответы (1)


У меня такая же проблема. Хотя я не знаю точной причины проблемы, есть способ обойти это:

Вместо того, чтобы указывать на родительский каталог, используйте подстановочный знак и укажите уровень файла avro.

sqlContext.read.format("com.databricks.spark.avro")\
    .load("/path/to/tables/t1/*/*.avro")
person Peter Pan    schedule 26.10.2016