Spark - Avro читает схему, но DataFrame пуст

Я использую 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 ИНФОРМАЦИЯ avro.AvroRelation: список hdfs://myhost.mydomain.com:8020/user/username/gobblin/ выход-задания / таблицы /t1 на драйвере

16/07/07 10:47:09 ИНФОРМАЦИЯ avro.AvroRelation: список hdfs://myhost.mydomain.com:8020/user/username/gobblin/ выход-задания / таблицы /t1/20160706230001_append на драйвере

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

1 ответ

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

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

sqlContext.read.format("com.databricks.spark.avro")\
    .load("/path/to/tables/t1/*/*.avro")
Другие вопросы по тегам