我正在使用CTAS构建新的“ ETL”管道。不幸的是,CTAS查询经常过于密集,导致雅典娜超时。因此,我使用CTAS创建初始表并填充一个小样本。然后,我编写一个脚本,查询在CTAS无法预先处理的剩余时间内查询生成CTAS的同一表(拼花格式)的情况。我将这些查询结果的输出写到保存CTAS查询结果的目录中,然后再修复表(以获取新数据)。但是,由于多种原因,这似乎是一个很笨拙的过程:
1)用标准SQL语句写出的查询结果最终都是字符串。例如,当我写出DAU的数量(这是一个计数并转换为整数)时,csv输出为字符串,即包装成 ””。 当采用CSV格式时,是否可以将Athena“ query_results”(不是CTAS)写成字符串以外的任何形式。这样做的主要问题是,由于这些列期望使用bigint,因此无法将其读回CTAS生成的表中。当然,这可以通过lambda函数来解决,但是对于一些琐碎的事情来说似乎是很大的开销。
2)能否将查询结果(不是来自CTAS)直接放入镶木地板而不是CSV中?
3)有什么方法可以防止使用query_results生成元数据(不是从CTAS)。同样,可以使用lambda函数对其进行清理,但这只是我需要处理的其他废话。
谢谢!
答案 0 :(得分:0)
结果的数据类型取决于创建结果的SQL以及使用方式。根据您的问题,我假设您正在使用CTAS创建表,并且输出为CSV,然后直接查看CSV数据。
该CSV将带有引号,但这并不意味着不可能将整数值读取为整数,依此类推。雅典娜(Athena)使用读取模式架构,只要Serde可以将值解释为特定类型,该类型就可以用作列的类型。
如果查询由CTAS操作创建的表,则应获取整数列的整数。
使用CTAS,您还可以创建不同类型的输出,例如JSON,Avro,Parquet和ORC,以保留类型信息。只是use the format
property to select the output type。
我对第三个问题的意思有点困惑。使用普通查询,您会在S3上获得两个文件,即数据文件和元数据文件,它们将被写入StartQueryExecution
API调用中给定的输出位置,而使用CTAS查询,您将获得以下数据:与元数据文件不同的位置(在SQL中指定)。
您实际上是在使用CTAS,还是在谈论常规查询结果文件?
在问题明确后进行更新:
1)不幸的是,雅典娜在许多情况下无法正确读取其自身的输出。这让我惊讶,他们在发布之前从未考虑过。您也许可以建立一个使用正则表达式Serde的表。
2)不,很遗憾,常规查询的唯一输出是CSV。
3)不,元数据总是与输出写入相同的前缀。
我认为最好的选择是运行多个CTAS查询,这些查询选择源数据的子集,例如,如果有日期列,则您可以每月进行一次CTAS,也可以进行其他一些工作。 CTAS查询完成后,您可以将结果文件移到S3上的同一目录中,并创建一个以该目录为位置的最终表。