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")