Hive AWS Athena配置单元:从列中的数据中删除不需要的字符

Hive AWS Athena配置单元:从列中的数据中删除不需要的字符,hive,amazon-athena,Hive,Amazon Athena,我是AWS上Hive和Athena的新手。表中的数据如下所示: _id type title _id看起来像{$oid:12asdf9} 我已经使用regexp\u extract创建了一个查询,除去实际id之外的所有数据 我现在需要将此查询的结果保存到_id列中 我正在尝试但无法开始工作的解决方案是: 在_id列上运行regexp_extract 选择我需要的所有其他列 将结果转储到新表中 我的代码返回第1:8行:在输入“创建外部”服务时没有可行的替代方案:amazonathena;身份代码

我是AWS上Hive和Athena的新手。表中的数据如下所示:

_id
type
title
_id看起来像{$oid:12asdf9}

我已经使用regexp\u extract创建了一个查询,除去实际id之外的所有数据

我现在需要将此查询的结果保存到_id列中

我正在尝试但无法开始工作的解决方案是:

在_id列上运行regexp_extract 选择我需要的所有其他列 将结果转储到新表中 我的代码返回第1:8行:在输入“创建外部”服务时没有可行的替代方案:amazonathena;身份代码:400;错误代码: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/'
注意:我在源S3 bucket中手动创建了一个新的目录cleanedAnnounces,我不确定这是否意味着指向Athena输出bucket,而不是执行CREATE TABLE,因为您应该使用RegexSerDe执行CREATE TABLE语句。下面是我使用RegexSerDe构建表的尝试

注意:下面假设S3文件行的格式为{$oid:12asdf9}类型的标题


我认为首先你使用的是正则表达式,而Athena使用Presto可以处理json,并且有json数据类型more info和一些

所以我认为你应该能够做到这一点:

SELECT json_extract(_id,'$.$oid') AS _id FROM sitbi_test_db.announcements
检索所有嵌套的json id。然后您可以使用,因为Athena不支持selects AFAIK中的select,而是使用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)需要倒勾,因此这也可能会干扰您的查询。希望这有帮助

据我所知,您不能在athena中使用select语句创建表,它们必须从S3加载,因此看起来好像您指向S3中的某个位置,但实际上并没有从中加载任何内容。谢谢,我将尝试并报告。
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/'