繁体   English   中英

AWS Amazon Athena 无法使用 BOOLEAN 字段对数据进行分区

[英]AWS Amazon Athena impossible to partitioning data with a BOOLEAN field

我正在尝试使用布尔字段对 Amazon Athena 上的数据进行分区,但它似乎不起作用。

我的数据(在 JSON 中)看起来像这样的架构:

{
    "name": "apple",
    "size": "L",
    "color": "red",
    "fruit": true
}

or

{
    "name": "brocolis",
    "size": "L",
    "color": "green",
    "fruit": false
}

我在 Amazon athena 上创建了如下表:

CREATE EXTERNAL TABLE fruits (
  name string, 
  color string, 
  size string
)
PARTITIONED BY (fruit boolean)
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe' 
LOCATION
  's3://bucket-for-athena-test/'

然后我尝试像这样创建第一个分区:

ALTER TABLE fruits ADD PARTITION (fruit = true) LOCATION 's3://bucket-for-athena-test/fruits/'

我收到一条错误消息:

Your query has the following error(s):

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:One or more parameter values were invalid: An AttributeValue may not contain an empty string (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: FI07HJFNAKH3HLUU5DATP2G4LJVV4KQNSO5AEMVJF66Q9ASUAAJG))

This query ran against the "fruits_database" database, unless qualified by the query. Please post the error message on our forum or contact customer support with Query Id: 3aa0434e-b492-4090-8dd6-24e498a0e1fa.

有人可以帮我吗?

先感谢您。

源错误是:

一个或多个参数值无效:AttributeValue 不能包含空字符串

这意味着分区查询是在不存在的列(属性值)上尝试的。

分区查询中指定的列名称是'fruit'

但是,表结构中未定义名为“fruit”的列。 这是错误的根本原因。

如何解决问题?

修复可以通过两种方式完成 -

  1. 对表结构中存在的列名之一运行分区查询(例如:color)

  2. 更改表结构以将“水果”作为列包含在内。

Athena 使用的分区样式源自 Hive 样式。 您不能从实际数据创建以分区列作为列的表。 相反,此分区应该是您位置的一部分,例如在您的情况下,s3 路径应该是类似's3://bucket-for-athena-test/fruit=mango''s3://bucket-for-athena-test/fruit=apple'

所以这条路径's3://bucket-for-athena-test/fruit=mango'将包含所有芒果的数据,而's3://bucket-for-athena-test/fruit=apple'将包含苹果。

当您在此表上运行查询时,应用过滤器,例如select * from table where fruit = 'mango'这只会扫描芒果数据,而不会更改其他文件夹。这是分区的实际好处,它跳过扫描不必要的数据。

要阅读有关分区的更多信息,请参阅

所以,如果你想从普通表创建分区表,那么你可以使用CTAS例如如图这里

CREATE TABLE fruits_partitioned 
WITH (
     format = 'TEXTFILE',  
     external_location = 's3://bucket-for-athena-test/', 
     partitioned_by = ARRAY['fruit']) 
AS SELECT column1, column2, column3, fruit
FROM fruit_unpartitioned;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM