我是aws athena的新手,我正在尝试查询多个包含json文件的s3存储桶。我遇到了许多文档中没有任何答案的问题(遗憾的是,他们的错误日志信息不足,无法亲自解决):
如何查询带括号的json字段?例如,我有一个名为“容量(gb)”的字段,当我试图在create external语句中包含时,我收到一个错误:
CREATE EXTERNAL TABLE IF NOT EXISTS test-scema.test_table (
`device`: string,
`Capacity(GB)`: string)
您的查询有以下错误:
失败:执行错误,从org.apache.hadoop.hive.ql.exec.ddltask返回代码1。java.lang.illegalargumentexception:错误::应位于“容量(gb):字符串>”位置,但找到了“(”。
我的文件位于s3的子文件夹中,结构如下:
'位置\名称/yyyy/mm/dd/appstring/'
我想查询一个特定应用程序字符串的所有日期(很多个)。是否有任何“通配符”可用于替换日期路径?像这样: LOCATION 's3://location_name/%/%/%/appstring/'
我必须使用create external table加载原始数据,然后才进行查询,还是可以添加一些where语句?具体来说,这样的事情是可能的:
CREATE EXTERNAL TABLE IF NOT EXISTS test_schema.test_table (
field1:string,
field2:string
)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = '1'
) LOCATION 's3://folder/YYYY/MM/DD/appstring'
WHERE field2='value'
在计费方面会有什么结果?因为现在我构建这个create语句只是为了再次重用sql查询中的数据。
谢谢!
1条答案
按热度按时间yhxst69z1#
1.用括号命名的json字段
不需要创建名为
Capacity(GB)
. 而是使用其他名称创建字段:如果您使用的是嵌套的json,那么就可以使用serde的
mapping
属性(我在处理嵌套结构的hive serde的问题上看到):这在以下输入条件下运行良好:
2.子文件夹
不能通配符中间路径(
s3://location_name/*/*/*/appstring/
). 最接近的选择是使用分区数据,但这将需要不同的目录命名格式。3.创建表
不能指定
WHERE
声明作为CREATE TABLE
声明。如果您的目标是降低数据成本,那么可以使用分区数据来减少扫描的文件数,或者以基于列的格式(如parquet)存储。
例如,请参阅:使用AmazonAthena分析s3中的数据