athena aws错误的字段名和多个带有配置单元ddl的文件夹

xbp102n0  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(200)

我是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查询中的数据。
谢谢!

yhxst69z

yhxst69z1#

1.用括号命名的json字段
不需要创建名为 Capacity(GB) . 而是使用其他名称创建字段:

CREATE EXTERNAL TABLE test_table (
    device string,
    capacity string
)
ROW FORMAT  serde 'org.apache.hive.hcatalog.data.JsonSerDe'
with serdeproperties ( 'paths'='device,Capacity(GB)')
LOCATION 's3://xxx';

如果您使用的是嵌套的json,那么就可以使用serde的 mapping 属性(我在处理嵌套结构的hive serde的问题上看到):

CREATE external TABLE test_table (
   top string,
   inner struct<device:INT,
               capacity:INT>
   )
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
with serdeproperties
(
"mapping.capacity" = "Capacity(GB)"
)
LOCATION 's3://xxx';

这在以下输入条件下运行良好:

{ "top" : "123", "inner": { "Capacity(GB)": 12, "device":2}}

2.子文件夹
不能通配符中间路径( s3://location_name/*/*/*/appstring/ ). 最接近的选择是使用分区数据,但这将需要不同的目录命名格式。
3.创建表
不能指定 WHERE 声明作为 CREATE TABLE 声明。
如果您的目标是降低数据成本,那么可以使用分区数据来减少扫描的文件数,或者以基于列的格式(如parquet)存储。
例如,请参阅:使用AmazonAthena分析s3中的数据

相关问题