我试图用一个布尔字段来划分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.
有人能帮帮我吗?
先谢谢你。
2条答案
按热度按时间oiopk7p51#
源错误是:
一个或多个参数值无效:attributevalue不能包含空字符串
这意味着分区查询是在不存在的列(属性值)上尝试的。
分区查询中指定的列名为“fruit”。
但是,表结构中没有定义名为“fruit”的列。这是错误的根本原因。
如何解决这个问题?
修复可以通过两种方式完成-
对表结构中存在的列名之一运行分区查询(例如:color)
修改表结构,将“fruit”作为一列。
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示例