【问题标题】:AWS Amazon Athena impossible to partitioning data with a BOOLEAN fieldAWS Amazon Athena 无法使用 BOOLEAN 字段对数据进行分区
【发布时间】:2020-02-06 10:03:49
【问题描述】:

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

有人可以帮帮我吗?

提前谢谢你。

【问题讨论】:

    标签: amazon-web-services hive amazon-dynamodb partitioning amazon-athena


    【解决方案1】:

    来源错误是:

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

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

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

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

    如何解决问题?

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

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

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

    【讨论】:

    • 您好,感谢您的回答。问题是我在布尔字段上进行分区。事实上,如果我执行相同的处理但我按大小分区:CREATE EXTERNAL TABLE fruits ( name string, color string, fruit boolean ) PARTITIONED BY (size string) 一切都运行顺利,没有问题。在 Athena 查询语言中,我们不必在声明的列 (docs.aws.amazon.com/fr_fr/athena/latest/ug/partitions.html) 中包含分区列,否则会抛出错误:FAILED: SemanticException [Error 10035]: Column repeated in partitioning columns
    【解决方案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' 这样的过滤器,这将只扫描芒果数据,而其他文件夹不受影响。这是分区的实际好处,它跳过扫描不必要的数据。

    要了解有关分区的更多信息,请参阅this

    因此,如果您想从普通表创建分区表,那么您可以使用 CTAS 示例,如图所示 here

    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;
    

    【讨论】:

    • 您好,感谢您的回复。问题不在于我不能分区。正如你解释的那样,我可以在水果上做得很好。但另一方面,当涉及到布尔分区时,就没有任何作用了。
    • 在分区列类型 issues.apache.org/jira/browse/HIVE-6590 中涉及布尔类型时似乎存在问题。我不认为 Athena 使用 Hive 3.0 解决了这个问题
    • 我也看到了这个问题,我希望问题不是来自那里,但我担心这才是真正的问题......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2021-06-01
    • 2020-09-11
    • 2019-09-16
    相关资源
    最近更新 更多