将从 AWS Glue 目录创建 AWS Athena table 定义的实用程序,以便我可以添加 WITH SERDEPROPERTIES 部分

Utility that will create an AWS Athena table definition from AWS Glue catalog so I can add a WITH SERDEPROPERTIES section

[更新:看起来 aws glue get-table --database-name xyz --name tablename 会给我 table 定义的原材料,这就是进步——只是想知道是否存在自动组装零件的东西]

[更新 2:您可以让 Cloudtrail 显示 Athena table 定义,无需 使用本 CloudTrail specific Athena documentation 中讨论的胶水或胶水爬虫。它仍然有一些怪癖(没有将一些更复杂的数据元素定义为结构),但它比指向 cloudtrail 时胶水生成的要好。]

我有一个带有云跟踪日志的 Glue 编目 S3 存储桶。 JSON 嵌套得很深。在深处,有一些属性,如 encryptionContext:struct<aws\:cloudtrail\:arn:string,aws\:s3\:arn:string>。 属性 名称中的那些冒号正在抛弃 Athena 并导致查询失败。

我发现通过 Serde 提供一个可以克服这个问题的映射很容易,但是为此,我必须为 Athena 生成一个外部 table 定义,这样我就可以编写一个table 定义中的 WITH SERDEPROPERTIES 部分。

我想从 Glue 目录自动生成 Athena table 定义(相当复杂)。有人有指向此类代码或实用程序的指针吗?

在 "Walkthrough: Handling forbidden characters with mappings".

部分的 this AWS Big Data Blog post 中描述了映射违规 属性 名称的方法

这是我在 Athena table 中执行简单 select 时遇到的错误示例,其元数据由 Glue 提供:

HIVE_METASTORE_ERROR: com.facebook.presto.spi.PrestoException: Error: : expected at the position 997 of 'struct,stackName:string,keyId:string,aggregateField:string,filter:struct,startTimes:array>>,host:array,bucketName:string,location:array,roleArn:string,roleSessionName:string,templateURL:string,encryption:array,parameters:array>,includeShared:boolean,topicArn:string,policyName:string,attributeName:string,attributeValue:string,protocol:string,endpoint:string,returnSubscriptionArn:boolean,name:string,attributes:struct,eventCategory:string,maxResults:int,notificationARNs:array,capabilities:array,tags:array,disableRollback:boolean,lookupAttributes:array>,policy:string,description:string,keyUsage:string,customerMasterKeySpec:string,origin:string,bypassPolicyLockoutSafetyCheck:boolean,aliasName:string,targetKeyId:string,trailName:string,encryptionContext:struct<aws:cloudtrail:arn:string,aws:s3:arn:string>,keySpec:string,trailNameList:array,includeShadowTrails:boolean,s3BucketName:string,s3KeyPrefix:string,snsTopicName:string,includeGlobalServiceEvents:boolean,isMultiRegionTrail:boolean,enableLogFileValidation:boolean,kmsKeyId:string,bucketPolicy:struct,Sid:string,Condition:struct>>>>,eventSelectors:array,excludeManagementEventSources:array>>,ServerSideEncryptionConfiguration:struct>>,tagging:array,Tagging:struct>>>,x-amz-acl:array,resourceIdList:array,logging:array,website:array,lifecycle:array,notification:array,versioning:array,publicAccessBlock:array,acl:array,cors:array,object-lock:array,requestPayment:array,replication:array,resourceArn:string,DescribeFlowLogsRequest:string>' but '\' is found. (Service: null; Status Code: 0; Error Code: null; Request ID: null)

从 Glue table 获取 DDL 的常用方法是 运行 SHOW CREATE TABLE foo,但由于 Glue 创建了一个 table,它在 Athena 中不起作用,我认为这会失败。

在您的特定情况下,您应该只使用 Athena documentation on querying CloudTrail. Apart from the partitioning it's as good as it gets. As you know, there are free-form properties that are service-dependent in CloudTrail events, and there is no schema that will capture everything (even if there was, as soon as a new service was launched it would be outdated). Stick with string for the columns corresponding to the free-form properties and use Athena/Presto's JSON functions 建议的模式来查询这些列。

我会对模式做一个小的修改,并有一组不同的分区键。文档使用地区、年、月、日。您可能想要添加帐户 ID 和组织 ID(如果您的跟踪是组织跟踪)——但更重要的是,您不应将年、月和日期作为单独的分区键,这会使查询日期范围变得不必要地复杂。没有理由不简单地使用 "date"(或者 "dt",如果你想避免引用它),输入为 stringdate 作为分区键,然后像这样添加分区:

ALTER TABLE cloud_trail ADD 
PARTITION (account_id = '1234567890', region = 'us-east-1', dt = '2020-05-17')
LOCATION 's3://trails/AWSLogs/Account_ID/CloudTrail/us-east-1/2020/05/17/'

仅仅因为某些内容在 S3 键中被斜杠分隔并不意味着它必须是单独的分区键。使用单个键可以轻松进行范围查询,例如 WHERE "date" BETWEEN '2019-12-01' AND '2020-06-01'.

Glue Crawlers 非常糟糕,因为您没有找到它们预期的用例,而且我对它创建无法使用的架构一点也不感到惊讶。在某种程度上,有如此多的 AWS 服务案例早于 Glue,而 Glue 在其输出上使用时只会产生无法使用的结果,这在某种程度上是相当惊人的。

对于 CloudTrail,Glue Crawlers 的架构发现方面不是必需的,并且由于自由格式的属性,可能主要会导致问题。另一方面,添加新分区,可以使用 Lambda 函数 运行ning 每天一次添加第二天的分区来解决(因为明天的分区是确定性的,您不必等到有数据添加分区).