Кастинг не работает правильно в Амазонке Афина (Престо)? - PullRequest
0 голосов
/ 02 декабря 2019

У меня есть набор данных реестра лицензий для врачей, в который входит total_submitted_charge_amount для каждого доктора, а также количество разрешений с помощью Medicare и Medicaid. Я использовал запрос из ответа, предложенного ниже:

    with datamart AS 
    (SELECT npi,
         provider_last_name,
         provider_first_name,
         provider_mid_initial,
         provider_address_1,
         provider_address_2,
         provider_city,
         provider_zipcode,
         provider_state_code,
         provider_country_code,
         provider_type,
         number_of_services,

        CASE
        WHEN REPLACE(num_entitlement_medicare_medicaid,',', '') ='' THEN
        null
        ELSE CAST(REPLACE(num_entitlement_medicare_medicaid,',', '') AS DECIMAL)
        END AS medicare_medicaid_entitlement,
        CASE
        WHEN REPLACE(total_submitted_charge_amount,',', '') ='' THEN
        null
        ELSE CAST(REPLACE(num_entitlement_medicare_medicaid,',', '') AS DECIMAL)
        END AS total_submitted_charge_amount
    FROM cmsaggregatepayment2017)
SELECT *
FROM datamart
ORDER BY  total_submitted_charge_amount DESC

К сожалению, я получаю ошибку

INVALID_CAST_ARGUMENT: Невозможно привести VARCHAR '' к DECIMAL (38, 0)

Этот запрос выполнялся к базе данных aggregatepayment_data_2017, если только запрос не был квалифицирован. Пожалуйста, опубликуйте сообщение об ошибке на нашем форуме или свяжитесь со службой поддержки с помощью Query Id: be01d1e8-dc4d-4c75-a648-428dcb6be3a5. "Я пробовал Decimal, Real, Big int и ничего не работает для приведения num_entitlement_medicare_medicaid. Ниже приведен скриншот того, как выглядят данные:

enter image description here

Может кто-нибудь подсказать, как перефразировать этот запрос?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2019

Вместо добавления приведения / замены в ваши запросы, вы можете преобразовать данные в новую таблицу с "чистыми" данными:

CREATE TABLE clean_table
WITH (format='Parquet', external_location='s3://my_bucket/clean_data/')
AS
SELECT
  npi,
  provider_last_name,
  provider_first_name,
  ...
  CASE WHEN REPLACE(num_entitlement_medicare_medicaid,',', '') ='' THEN null
       ELSE CAST(REPLACE(num_entitlement_medicare_medicaid,',', '') AS DECIMAL)
       END AS medicare_medicaid_entitlement,
  CASE WHEN REPLACE(total_submitted_charge_amount,',', '') ='' THEN null
       ELSE CAST(REPLACE(num_entitlement_medicare_medicaid,',', '') AS DECIMAL)
       END AS total_submitted_charge_amount
  FROM cmsaggregatepayment2017

Вы можете SELECT ... FROM clean_table безнеобходимость выполнения каких-либо преобразований.

В хранилищах данных этот тип процесса известен как ETL (Extract, Transform, Load). Процесс очистки - это «преобразование» для преобразования данных в более полезный формат.

См .: CREATE TABLE AS - Amazon Athena

0 голосов
/ 02 декабря 2019

Причина, по которой вы получаете ошибку, заключается в том, что в столбце есть пустое значение (но оно не равно нулю), и мы не можем преобразовать varchar '' в десятичное число. Возможно, вы можете использовать case case. Также, согласно столбцу набора данных, num_entitlement_medicare_medicaid содержит запятую ',', которую вы не заменяете.

    SELECT npi, 
case
when REPLACE(num_entitlement_medicare_medicaid,'[^A-Za-z0-9.]', '') ='' then null
else CAST(REPLACE(num_entitlement_medicare_medicaid,'[^0-9.]', '') AS DECIMAL)
end as medicare_medicaid_entitlement,
case 
when REPLACE(total_submitted_charge_amount,'[^A-Za-z0-9.]', '') ='' then null
else CAST(REPLACE(total_submitted_charge_amount,'[^0-9.]', '') AS DECIMAL)
end as total_submitted_charge_amount
FROM cmsaggregatepayment2017
...