Импала не удается создать многораздельную таблицу из-за поврежденного файла паркета - PullRequest
1 голос
/ 31 января 2020

Я сохраняю файл секционированного паркета в корзине S3, используя Dask следующим образом:

dd.to_parquet(
    dd.from_pandas(df, npartitions=1),
    path='s3a://test/parquet',
    engine='fastparquet',
    partition_on='country',
    object_encoding='utf8',
    compression="gzip",
    write_index=False,
)

Файлы паркета успешно созданы; Вот структура каталогов: Структура каталогов

Я успешно создаю таблицу Impala из этого паркета:

create external table tmp.countries_france
like parquet 's3a://test/parquet/_metadata'
partitioned by (country string)
stored as parquet location 's3a://test/parquet/'

, а также добавляю раздел в эту таблицу:

alter table tmp.countries_france add partition (sheet='belgium')

Однако, когда я делаю select * from tmp.countries_france, я получаю следующую ошибку:

Файл 's3a: //test/parquet/sheet=france/part.0. parquet 'поврежден: метаданные указывают на нулевое количество строк, но есть хотя бы одна непустая группа строк.

Я думаю, что проблема исходит от Dask, потому что когда я создаю паркет без разделов, это работает хорошо. Я попытался установить write_index=True, но не повезло.

1 Ответ

1 голос
/ 31 января 2020

Я не вижу этого

df = pd.DataFrame({'a': np.random.choice(['a', 'b', 'c'], size=1000),
                   'b': np.random.randint(0, 64000, size=1000),
                   'c': np.random.choice([True, False], size=1000)})
writer.write(tempdir, df, partition_on=['a', 'c'], file_scheme=scheme)
df = dd.from_pandas(df, npartitions=1)
df.to_parquet('.', partition_on=['a', 'c'], engine='fastparquet')

pf = fastparquet.ParquetFile('_metadata')
pf.count  # 1000
len(pf.to_pandas())  # 1000
pf.row_groups[0].num_rows  # 171

pf = fastparquet.ParquetFile('a=a/c=False/part.0.parquet')
pf.count # 171
pf.row_groups[0].num_rows  # 171

Очевидно, я не могу говорить о том, что может делать импала - но, возможно, механизм "как" ожидает найти данные в файле _metadata?

Обратите внимание, что pandas может выполнять запись в / из паркета без промедления, с теми же параметрами.

...