1

我正在尝试使用布尔字段对 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.

有人可以帮我吗?

先感谢您。

4

2 回答 2

0

Athena 使用的分区样式来源于 Hive 样式。您不能根据实际数据创建将分区列作为列的表。相反,这个分区应该是您位置的一部分,例如在您的情况下,s3 路径应该是类似的东西's3://bucket-for-athena-test/fruit=mango'or '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;
于 2020-02-07T04:59:23.440 回答
0

源错误是:

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

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

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

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

如何解决问题?

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

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

  2. 更改表结构以包含“fruit”作为列。

于 2020-02-06T20:14:53.973 回答