Создать таблицу поверх существующего паркетного файла в клею - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть файл паркета в S3, над которым я хотел бы создать таблицу склеивания. Я использую API boto3 python для этого. Вот код:

import boto3

c = boto3.client('glue')

c.create_table(DatabaseName='staging', 
               TableInput={
                           'Name': 'test_table', 
                           'StorageDescriptor': {
                               'Location': 's3://staging/tables/test_table/version=2020-03-26',             
                           'OutputFormat':'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat', 
                           'InputFormat': 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'},
                           'PartitionKeys': [{'Name': 'country'}, {'Name': 'city'}], 
                           'TableType': 'EXTERNAL_TABLE'})

Если мы посмотрим на поле «Местоположение», то увидим URL-адрес данных. В версии папки = 2020-03-26 у нас есть папка, например, «страна = название страны», а внутри каждой из этих папок есть другие папки, такие как «город = название города», в которых находятся файлы паркета.

Исключение из этого кода возвращает:

{'ResponseMetadata': {'HTTPHeaders': {'connection': 'keep-alive',
   'content-length': '2',
   'content-type': 'application/x-amz-json-1.1',
   'date': 'Mon, 06 Apr 2020 08:46:58 GMT',
   'x-amzn-requestid': 'ca5e4af0-a2ec-4af0-a2ec-18c308132e21'},
  'HTTPStatusCode': 200,
  'RequestId': 'ca5e4af0-a10d-a2ec-a13d-453dfsdfsds',
  'RetryAttempts': 0}}

И я вижу таблицу на клей, но когда я пытаюсь запросить таблицу на Афина, у меня появляется ошибка:

описать отформатированный test_table

Your query has the following error(s):

FAILED: SemanticException Unable to fetch table test_table. Unable to get table: java.lang.NullPointerException

Что я делаю не так? Также я только что проверил клей, хотя запись в таблице создана, у меня нет информации, возвращаемой из интерфейса.

1 Ответ

1 голос
/ 07 апреля 2020

Работа напрямую с Glue API с использованием boto3 иногда бывает слишком многословной, и отсутствие одного или двух параметров может вызвать критическую ошибку. Перед тем, как приступить к деталям API, я рекомендую вам взглянуть на AWS Wrangler .

С помощью пары команд вы можете прочитать данные в Pandas dataframe, а затем создать таблицу с вашей предпочтительной структурой:

import awswrangler as wr

df = wr.pandas.read_parquet(path='s3://staging/tables/test_table/version=2020-03-26', 
                            columns=['country', 'city', ...], filters=[("c5", "=", 0)])

# Typical Pandas, Numpy or Pyarrow transformation HERE!

wr.pandas.to_parquet(  # Storing the data and metadata to Data Lake
    dataframe=df,
    database='my_database',
    path='s3://production/tables/test_table/version=2020-03-26',
    partition_cols=['country', 'city'],
)

Если вы используете PySpark и хотите зарегистрироваться фрейм данных в клей:

import awswrangler as wr

dataframe.write \
        .mode("overwrite") \
        .format("parquet") \
        .partitionBy(["country", "city"]) \
        .save(compression="gzip", path="s3://production/tables/test_table/version=2020-03-26.")
sess = wr.Session(spark_session=spark)
sess.spark.create_glue_table(
    dataframe=dataframe,
    file_format="parquet",
    partition_by=["country", "city"],
    path="s3://production/tables/test_table/version=2020-03-26",
    compression="gzip",
    database="my_database")
...