我是新来的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输出存储桶
2条答案
按热度按时间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/';
6uxekuva2#
我认为首先,当athena(使用presto)可以处理json并且有一个json数据类型(这里有更多信息,还有关于athena的更多信息)时,您使用的是regex。
所以我认为你应该能够做到:
检索所有嵌套的json id。然后您可以使用with语句,因为athena不支持selects内的select(afaik)-而是使用with语句:
但是我不认为你需要这么做。请修改您以前的ctas声明:
我还相信雅典娜对列标题(小写字母、数字+下划线)有限制,根据这一点,以下划线开头的名字就像你的名字一样
_id
需要反勾号,这样也可能会干扰您的查询。希望这有帮助!