создать внешнюю таблицу athena для паркета создать с помощью spark 2.2.1, данные отсутствуют или неверны с типами десятичной или временной отметки - PullRequest
0 голосов
/ 10 апреля 2020

Я попытался создать внешнюю таблицу из файлов паркета s3 (созданных с помощью spark, сохраненных в s3) в Афине. Всякий раз, когда тип данных является десятичным или отметкой времени, после

select "column" from athena_table

данные не отображаются. Код, который я использовал для создания внешней таблицы, выглядит следующим образом

CREATE EXTERNAL TABLE IF NOT EXISTS tablename (
`date` timestamp, 
`number` decimal(38, 0)
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = '1'
)
LOCATION 's3 path'
TBLPROPERTIES (
  'has_encrypted_data'='true'
);

Что я пробовал:

  1. Заменить десятичное число (38, 0) в приведенном выше коде на двойное, не работает, в этом столбце ничего не отображается
  2. Заменить десятичное число (38, 0) или метку времени в указанном выше коде на строка, не работает, искаженный символ отображается
  3. Обновите тип данных в моем файле партера s3 в двух вышеуказанных форматах (двойной или строковый) и восстановите файл, не работает, ошибка

    HIVE_BAD_DATA: тип поля 'число' поля FIXED_LEN_BYTE_ARRAY в паркете несовместим с типом double, определенным в схеме таблицы`

1 Ответ

0 голосов
/ 10 апреля 2020

Попробуйте использовать AWS Wrangler , чтобы записать Dataframe как файл паркета и зарегистрировать его как таблицу в Glue and Athena.

import awswrangler as wr

dataframe.write \
        .mode("overwrite") \
        .format("parquet") \
        .partitionBy(["year", "month"]) \
        .save(compression="gzip", path="s3://...")
sess = wr.Session(spark_session=spark)
sess.spark.create_glue_table(
    dataframe=dataframe,
    file_format="parquet",
    partition_by=["year", "month"],
    path="s3://...",
    compression="gzip",
    database="my_database")
...