我有一个非常基本的s3设置,我想使用Athena查询.数据全部存储在一个存储桶中,组织为年/月/日/小时文件夹.
|--data
| |--2018
| | |--01
| | | |--01
| | | | |--01
| | | | | |--file1.json
| | | | | |--file2.json
| | | | |--02
| | | | | |--file3.json
| | | | | |--file4.json
...
Run Code Online (Sandbox Code Playgroud)
然后我设置了一个AWS Glue Crawler来抓取s3://bucket/data.所有文件中的架构都是相同的.我希望我会得到一个数据库表,包括年,月,日等的分区.
我得到的是成千上万的表.每个文件都有一个表,每个父分区也有一个表.据我所知,为每个文件/文件夹创建了单独的表,没有一个可以在大日期范围内查询的总体表.
我尽可能地遵循说明https://docs.aws.amazon.com/glue/latest/dg/crawler-configuration.html,但无法弄清楚如何构建我的分区/扫描,这样我就不会得到这个巨大的,几乎毫无价值的数据转储.
我们在 S3 中有非常多的文件夹和文件,都在一个特定的文件夹下,我们想抓取所有 CSV 文件,然后从Athena 中的一张表中查询它们。CSV 文件都具有相同的架构。问题是爬虫为每个文件生成一个表,而不是一个表。爬虫配置有一个复选框选项“为每个 S3 路径创建一个模式”,但这似乎没有任何作用。
我需要的可能吗?谢谢。
我收到一个HIVE_PARTITION_SCHEMA_MISMATCH错误,我不太确定该怎么办。当我查看 2 个不同的模式时,唯一不同的是我的一个结构中的键顺序(由胶水爬虫创建)。我真的不关心数据的顺序,我以 JSON blob 的形式接收数据,所以我不能保证键的顺序。
struct<device_id:string,user_id:string,payload:array<struct<channel:string,sensor_id:string,type:string,unit:string,value:double,name:string>>,topic:string,channel:string,client_id:string,hardware_id:string,timestamp:bigint,application_id:string>
struct<device_id:string,user_id:string,payload:array<struct<channel:string,name:string,sensor_id:string,type:string,unit:string,value:double>>,topic:string,channel:string,client_id:string,hardware_id:string,timestamp:bigint,application_id:string>
Run Code Online (Sandbox Code Playgroud) 我的 json 数据看起来像这样:
{ "col1" : 123, "metadata" : { "opt1" : 456, "opt2" : 789 } }
Run Code Online (Sandbox Code Playgroud)
其中各种元数据字段(有很多)是可选的,并且可能存在也可能不存在。
我的查询是:
select col1, metadata.opt1 from "db-name".tablename
Run Code Online (Sandbox Code Playgroud)
如果opt1不存在于任何行中,我希望这会返回该列为空白的所有行opt1,但是如果爬网程序运行时没有包含 in 的行opt1(metadata并且当查询时可能仍然不存在于数据中)运行,因为它是可选的),查询失败,并显示:
SYNTAX_ERROR: line 2:1: Column '"metadata"."opt1"' cannot be resolved
Run Code Online (Sandbox Code Playgroud)
我可以在架构定义中手动指定这些字段(如果我不使用爬网程序),但它不会拾取可能到达的任何新元数据字段,并且指定静态架构似乎并不在雅典娜应该如何工作的精神。
如何让它按预期运行(最好不要放入虚拟行或自定义 SerDe)?
org.openx.data.jsonserde.JsonSerDe目前使用SerDe 。
感谢您的任何想法。