使用Athena查询DynamoDB备份并将结果存储到S3上

0

【以下的问题经过翻译处理】 我尝试读取DynamoDB的S3备份,但是出现了各种错误。

数据看起来像这样:

{"SensorId":{"s":"sensor-10"},"Temperature":{"n":"63.85"},"CurrentTime":{"n":"1661540734"}}
{"SensorId":{"s":"sensor-10"},"Temperature":{"n":"63.84"},"CurrentTime":{"n":"1661540736"}}

我尝试了以下操作,成功了,但是查询失败了:

CREATE EXTERNAL TABLE IF NOT EXISTS sensor_data_presto (
    sensorID    struct<s:string>,
    temperature struct<n:float>,
    currentTime struct<n:bigint>
  )
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://bucket-name/';

以下查询会出现以下错误:

SELECT DISTINCT sensorID.s
FROM sensor_data_presto;

Row is not a valid JSON Object - JSONException: A JSONObject text must end with '}' at 39 [character 40 line 1]

我还尝试了以下操作,成功了,但是查询失败了:

CREATE EXTERNAL TABLE IF NOT EXISTS `mydatabase`.`sensor_data_regex` (
  sensorid string,
  temperature float,
  currenttime bigint
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' 
WITH SERDEPROPERTIES (
 'input.regex'='/^\{"SensorId":\{"s":("[a-z]*-[0-9]*"){1}\},"Temperature":\{"n":"([0-9]*[\.]?[0-9]*)"\}{1},"CurrentTime":\{"n":"([0-9]*){1}"\}\}$/g'
) LOCATION 's3://bucket-name/'
TBLPROPERTIES ('has_encrypted_data'='false');

我尝试过使用和不使用开头的/和结尾的/g。我尝试过带上和不带上结尾$。

以下查询会出现以下错误:

SELECT * FROM sensor_data_regex;

PatternSyntaxException thrown initializing deserializer org.apache.hadoop.hive.serde2.RegexSerDe. Cause: Illegal repetition near index 1 /^{"SensorId":{"s":("[a-z]*-[0-9]*"){1}},"Temperature":{"n":"([0-9]*[.]?[0-9]*)"}{1},"CurrentTime":{"n":"([0-9]*){1}"}}$/g ^

我试图复制《七周内七个数据库,第二版》一书中第 7 章:DynamoDB 中的示例,供我的大学课堂上使用。在使用 Athena 的最后一步之前,我能够更新整个管道以在 AWS 上运行。如果能提供有关更正这些错误或完成查询 DynamoDB 数据的管道(具有成本效益)的建议,我将不胜感激。

profile picture
专家
已提问 3 个月前19 查看次数
1 回答
0

【以下的回答经过翻译处理】 请再次检查您定义的S3桶中的路径中,是否含有其他不规范的文件,如有请删除后再次执行Athena的命令;您需要转义所有正则表达式元字符,请再次检查您定义的Table的通配符。

profile picture
专家
已回答 3 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则