【问题标题】:Hive lateral view not working AWS AthenaHive 横向视图不起作用 AWS Athena
【发布时间】:2017-08-10 07:37:39
【问题描述】:

我正在处理AWS Cloudtrail log analysis 的过程,我卡在从一行中提取 JSON 中,

这是我的表定义。

CREATE EXTERNAL TABLE cloudtrail_logs (
eventversion STRING,
eventName STRING,
awsRegion STRING,
requestParameters STRING,
elements STRING  ,
additionalEventData STRING
)
ROW FORMAT SERDE 'com.amazon.emr.hive.serde.CloudTrailSerde'
STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://XXXXXX/CloudTrail'

如果我运行select elements from cl1 limit 1,它会返回这个结果。

{"groupId":"sg-XXXX","ipPermissions":{"items":[{"ipProtocol":"tcp","fromPort":22,"toPort":22,"groups":{},"ipRanges":{"items":[{"cidrIp":"0.0.0.0/0"}]},"prefixListIds":{}}]}}

我需要将此结果显示为虚拟列,例如,

| groupId | ipProtocol | fromPort | toPort| ipRanges.items.cidrIp|
|---------|------------|--------- | ------|-----------------------------|
| -1      | 0          |          |       |                             |

我正在使用 AWS Athena,我尝试了横向视图,但 get_json_object 在 AWS 中不起作用。

它是一个外部表

【问题讨论】:

  • 请给出一个更好的数据样本,其中“items”包含多个元素
  • 问题已更新

标签: arrays json amazon-web-services hive amazon-athena


【解决方案1】:
select  json_extract_scalar(i.item,'$.ipProtocol')  as ipProtocol
       ,json_extract_scalar(i.item,'$.fromPort')    as fromPort
       ,json_extract_scalar(i.item,'$.toPort')      as toPort

from    cloudtrail_logs
        cross join unnest (cast(json_extract(elements,'$.ipPermissions.items') 
            as array(json))) as i (item)
;

 ipProtocol | fromPort | toPort
------------+----------+--------
 "tcp"      | 22       | 22

【讨论】:

  • select json_extract_scalar(uj,'$.ipProtocol') as ipProtocol ,json_extract_scalar(uj,'$.fromPort') as fromPort ,json_extract_scalar(uj,'$.toPort') as toPort from cl1 cross加入 unnest (json_extract(requestparameters,'$.ipPermissions.items')) 作为 u(j);我试过这个,它抛出 INVALID_FUNCTION_ARGUMENT: Cannot unnest type: json
  • 我认为该列是 json 数组。它是一个包含 json 的数组吗?请将表格定义(至少对于相关列)添加到您的帖子中。
  • 是的,这是我上一个问题的一部分[stackoverflow.com/questions/42877874/…,你回答了这个问题。所以主要目标是我需要将 json 行提取到列中。 {"groupId":"sg-XXXX","ipPermissions":{"items":[{"ipProtocol":"tcp","fromPort":22,"toPort":22,"groups":{}," ipRanges":{"items":[{"cidrIp":"0.0.0.0/0"}]},"prefixListIds":{}}]}}
猜你喜欢
  • 2017-07-13
  • 2019-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-23
  • 2017-08-06
  • 1970-01-01
相关资源
最近更新 更多