aws amazon athena不可能用一个布尔字段来划分数据

e37o9pze  于 2021-06-25  发布在  Hive
关注(0)|答案(2)|浏览(354)

我试图用一个布尔字段来划分AmazonAthena上的数据,但似乎不起作用。
我的数据(json格式)如下所示:

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

or

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

我在亚马逊雅典娜上创建了如下表格:

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.

有人能帮帮我吗?
先谢谢你。

oiopk7p5

oiopk7p51#

源错误是:
一个或多个参数值无效:attributevalue不能包含空字符串
这意味着分区查询是在不存在的列(属性值)上尝试的。
分区查询中指定的列名为“fruit”。
但是,表结构中没有定义名为“fruit”的列。这是错误的根本原因。
如何解决这个问题?
修复可以通过两种方式完成-
对表结构中存在的列名之一运行分区查询(例如:color)
修改表结构,将“fruit”作为一列。

vshtjzan

vshtjzan2#

雅典娜使用的分区样式是从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' 这将只扫描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;

相关问题