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

时间:2017-06-21 06:41:53

标签: hive amazon-athena

我是AWS的Hive和Athena的新手。我在表中看到的数据如下:

_id
type
title

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

我已设法创建一个查询,使用regexp_extract

删除除实际ID之外的所有内容的数据

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

我尝试的解决方案(我无法开始工作)是:

  1. regexp_extract
  2. 上运行_id
  3. 选择我需要的所有其他列
  4. 将结果转储到新表格
  5. 我的代码(见下文)返回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/'
    

    注意:我在源S3存储桶中手动创建了一个新目录cleanedAnnouncements,我不确定这是否意味着指向Athena输出存储桶

2 个答案:

答案 0 :(得分:0)

您应该使用RegexSerDe执行import timeit N = 5 s = timeit.default_timer() for _, i in zip(range(N), products): x = all_products.query('id == "{}"'.format(i)) e = timeit.default_timer() print('{:0.5f}s per query'.format((e - s) / N)) # 1.60075s per query s = timeit.default_timer() for _, i in zip(range(N), products): x = all_products[all_products['id'] == i] e = timeit.default_timer() print('{:0.5f}s per query'.format((e - s) / N)) # 3.00135s per query 语句,而不是执行CREATE TABLE AS。以下是我使用RegexSerDe构建表的尝试。

注意:以下假设S3文件行的格式为CREATE TABLE

{"$oid":"12asdf9"} type title

Athena docs on RegexSerDe

答案 1 :(得分:0)

我认为首先,当Athena(使用Presto)可以处理json并具有JSON数据类型(更多信息here和某些further info on Athena)时,您正在使用正则表达式。

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

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

检索所有嵌套的json id。然后,您可以使用WITH statements,因为Athena不支持select内的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/'

我还认为,雅典娜在列标题(小写字母,数字+下划线)上有限制,根据this,以_id之类的下划线开头的名称需要反引号,因此,弄乱您的查询。希望这会有所帮助!