aws雅典娜配置单元:从列中的数据中删除不需要的字符

ifsvaxew  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(310)

我是新来的Hive和雅典娜在aws。表中的数据如下所示:

_id
type
title

_id 看起来像 {"$oid":"12asdf9"} .
我已经成功地创建了一个查询,它使用 regexp_extract 我现在需要将这个查询的结果保存到 _id 列。
我正在尝试的解决方案(但我无法工作)是:
regexp_extract_id
选择我需要的所有其他列
将结果转储到新表中
我的代码(见下文)返回 line 1:8: no viable alternative at input 'create external' (service: amazonathena; status code: 400; error code: invalidrequestexception; .
如果能帮我解决这个问题,我将不胜感激。谢谢!

CREATE EXTERNAL TABLE sitbi_test_db.combined AS
SELECT unioned._id, unioned.type, unioned.title
FROM (
  SELECT a._id, regexp_extract( a._id, '(?<=oid\"\:\")(.*)(?=\"\})')
  FROM sitbi_test_db.announcements a
  UNION ALL  
) unioned
LOCATION 's3://sitbi-test-mongodb/cleanedAnnouncements/'

注意:我手动创建了一个新目录 cleanedAnnouncements 在我的sources3存储桶中,我不确定这是否指向athena输出存储桶

4dc9hkyq

4dc9hkyq1#

而不是表演 CREATE TABLE AS ,您应该执行 CREATE TABLE 带有regexserde的语句。下面是我使用regexserde构建表的尝试。
注意:下面假设s3文件行的格式为 {"$oid":"12asdf9"} type title ```
CREATE EXTERNAL TABLE IF NOT EXISTS sitbi_test_db.combined (
id STRING,
type STRING,
title STRING
) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "^.:"(.)."}.\s(.).\s(.*)$"
) LOCATION 's3://sitbi-test-mongodb/cleanedAnnouncements/';

雅典娜在regexserde的文件
6uxekuva

6uxekuva2#

我认为首先,当athena(使用presto)可以处理json并且有一个json数据类型(这里有更多信息,还有关于athena的更多信息)时,您使用的是regex。
所以我认为你应该能够做到:

SELECT json_extract(_id,'$.$oid') AS _id FROM sitbi_test_db.announcements

检索所有嵌套的json id。然后您可以使用with语句,因为athena不支持selects内的select(afaik)-而是使用with语句:

WITH dataset AS (SELECT json_extract(_id,'$.$oid') AS id FROM sitbi_test_db.announcements)
SELECT dataset.id FROM dataset

但是我不认为你需要这么做。请修改您以前的ctas声明:

CREATE EXTERNAL TABLE sitbi_test_db.combined AS
SELECT json_extract(_id,'$.$oid') AS id, type, title
FROM sitbi_test_db.announcements
LOCATION 's3://sitbi-test-mongodb/cleanedAnnouncements/'

我还相信雅典娜对列标题(小写字母、数字+下划线)有限制,根据这一点,以下划线开头的名字就像你的名字一样 _id 需要反勾号,这样也可能会干扰您的查询。希望这有帮助!

相关问题