我正在使用AWS S3、Glue和Athena进行以下设置:
S3级--
我的原始数据作为CSV文件存储在S3上。我正在使用Glue进行ETL,并使用Athena查询数据。
因为我使用的是雅典娜,所以我想将CSV文件转换为拼花。我现在正在用AWS胶水来做这个。这是我当前使用的流程:
胶水作业一次只允许我转换一个表。如果我有很多CSV文件,这个过程很快就变得无法管理。有没有更好的方法,也许是“正确”的方法,使用AWS Glue或其他一些AWS服务将许多CSV文件转换为Parket?
我不太喜欢胶水,也不喜欢从数据创建模式
以下是如何在雅典娜中做到这一点,它比胶水快得多。
这是针对CSV文件的:
create table foo (
id int,
name string,
some date
)
row format delimited
fields terminated by ','
location 's3://mybucket/path/to/csvs/'
这是拼花文件:
create table bar
with (
external_location = 's3://mybucket/path/to/parquet/',
format = 'PARQUET'
)
as select * from foo
即使使用分区,也不需要为拼花地板创建该路径
请参阅编辑以获取更新信息。
S3级--
为什么不直接将CSV格式用于Athena?
https://docs.aws.amazon.com/athena/latest/ug/supported-format.html
CSV是支持的格式之一。为了提高效率,您可以压缩多个CSV文件以加快加载速度。
支持压缩,
https://docs.aws.amazon.com/athena/latest/ug/compression-formats.html
希望有帮助。
编辑:
为什么拼花格式比CSV更有用?
https://dzone.com/articles/how-to-be-a-hero-with-powerful-parquet-google-and
S3级--
有关CSV到拼花地板转换的更多详细信息,
https://aws.amazon.com/blogs/big-data/build-a-data-lake-foundation-with-aws-glue-and-amazon-s3/
我也遇到过同样的情况,我想高效地循环遍历爬虫编目的目录表,这些目录表指向csv文件,然后将它们转换为拼花地板。不幸的是,网络上还没有太多可用的信息。这就是为什么我在LinkedIn上写了一篇博客,解释我是如何做到这一点的。请阅读;特别是第5点。希望这有帮助。请让我知道你的反馈。
注意:根据Antti的反馈,我正在粘贴下面博客中的摘录解决方案:
作业向导提供了在数据源上运行预定义脚本的选项。问题是,您可以选择的数据源是目录中的单个表。它不提供在整个数据库或一组表上运行作业的选项。您可以稍后修改脚本,但在glue catalog中遍历数据库表的方法也很难找到。有目录API,但缺少合适的示例。github示例repo可以通过更多的场景来丰富,以帮助开发人员。
经过一番周旋,我想出了下面的脚本来完成这项工作。我已经使用boto3客户端在表中循环。如果有人需要帮助,我会把它贴在这里。如果你有更好的建议,我也想听听你的意见
import sys
import boto3
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)
client = boto3.client('glue', region_name='ap-southeast-2')
databaseName = 'tpc-ds-csv'
print '\ndatabaseName: ' + databaseName
Tables = client.get_tables(DatabaseName=databaseName)
tableList = Tables['TableList']
for table in tableList:
tableName = table['Name']
print '\n-- tableName: ' + tableName
datasource0 = glueContext.create_dynamic_frame.from_catalog(
database="tpc-ds-csv",
table_name=tableName,
transformation_ctx="datasource0"
)
datasink4 = glueContext.write_dynamic_frame.from_options(
frame=datasource0,
connection_type="s3",
connection_options={
"path": "s3://aws-glue-tpcds-parquet/"+ tableName + "/"
},
format="parquet",
transformation_ctx="datasink4"
)
job.commit()
我的 hdfs 中有 Parquet 文件。我想将这些镶木地板文件转换为csv格式
我正在尝试使用AWS胶水将大约1.5 GB的Gzip CSV转换为拼花地板。下面的脚本是自动生成的粘合作业,用于完成该任务。这似乎需要很长时间(我已经等了10个dpu好几个小时了,从来没有看到它结束或产生任何输出数据) 我想知道是否有人有任何经验将1.5 GB GZIPPED CSV转换为镶木地板-是否有更好的方法来完成此转换? 我有TB的数据要转换。值得关注的是,转换GBs似乎需要很长时间。 我
我正在尝试将存储在HDFS(100Gbs)上的一堆多部分avro文件转换为拼花文件(保留所有数据) Hive可以使用以下命令将avro文件作为外部表读取: 但是当我试图设计一张拼花桌时: 它会抛出一个错误: 失败:执行错误,从org.apache.hadoop.hive.ql.exec.DDLTask返回代码1。java.lang.UnsupportedOperationException:未知字
问题内容: 这是我的代码,非常简单的东西… 声明一些字段名称,阅读器使用CSV读取文件,并使用字段名称将文件转储为JSON格式。这是问题所在… CSV文件中的每个记录都在不同的行上。我希望JSON输出采用相同的方式。问题在于,将其全部倾倒在一条长长的巨线上。 我试过使用类似的代码,然后在该代码下面运行我的代码,该代码循环遍历每一行,但它在一行上执行整个文件,然后在另一行上遍历整个文件…一直持续到行
问题内容: 我想将PDF文件转换为CSV文件。我为此使用iText库。程序运行正常,但输出格式不正确。所有数据都在csv文件的第一行中。输出应与pdf文件完全相同(表示带有换行符)。请帮忙。提前致谢。 问题答案: 您需要在每个表行之后在缓冲区中引入一个换行符’\ n’。