2

Я использую Gobblin периодически извлекать реляционные данные из Oracle, преобразовать его в avro и опубликовать его в HDFSSpark - Avro читает схемы, но DataFrame Пустой

Моя структура каталогов ДФС выглядит как этот

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

Однако, когда я бегу count или show, DataFrames пустые. Я проверил, что .avro файлы не являются пустыми, преобразовав его в JSON

java -jar avro-tools-1.7.7.jar tojson --pretty t1/20160706230001_append/part.f1.avro > t1.json 

Я подозреваю, что это может иметь что-то делать со структурой каталогов. Возможно, библиотеки Avro Spark выглядят только на одном уровне от корня для файлов .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: Listing hdfs: //myhost.mydomain.com: 8020/user/username/gobblin/job-output/tables/t1/20160706230001_append on driver

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

ответ

0

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

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

sqlContext.read.format("com.databricks.spark.avro")\ 
    .load("/path/to/tables/t1/*/*.avro") 
Смежные вопросы