我在AWS EMR中使用Spark 2.4。 我在我的ELT / ETL中使用Pyspark和SparkSQL,在AWS S3上使用带有Parquet输入和输出的DataFrames。
据我所知,自 Spark 2.4 起,还没有办法标记或自定义输出文件(镶木地板)的文件名。请纠正我吗?
当我将实木复合地板输出文件存储在S3上时,最终得到的文件名看起来像这样:
part-43130-4fb6c57e-d43b-42bd-afe5-3970b3ae941c.c000.snappy.parquet
文件名的中间部分似乎已嵌入了GUID / UUID:
part-43130- 4fb6c57e-d43b-42bd-afe5-3970b3ae941c .c000.snappy.parquet
我想知道是否可以在运行时时从PySpark或SparkSQL函数获取此GUID / UUID值,以便将该值记录/保存/显示在文本文件中?>
我需要记录此GUID / UUID值,因为出于手动回滚的目的(例如,我可能会在一天或一周后发现此问题),稍后可能需要删除带有该值的文件作为其名称的一部分。数据已损坏,需要删除,因此可以识别和删除所有带有GUID / UUID标签的文件。
我知道我可以在GUID列上手动对表进行分区,但是最后我得到的分区过多,因此会影响性能。我需要以某种方式为每个数据加载作业标记文件,以便我可以轻松地从S3中识别和删除它们,因此GUID / UUID值似乎是一种可能的解决方案。
打开以获取其他建议。
谢谢
答案 0 :(得分:0)
这是新的“ s3a特定提交者”吗?如果是这样,则表示他们正在使用netflix的代码/技巧在每个写入的文件上使用GUID,以避免最终出现一致性问题。但这并没有太大帮助。
短期:好吧,您始终可以列出目录树的前后状态(提示:使用FileSystem.listFiles(path,recursive)来提高速度),并记住新文件或重命名它们(这会很慢:记住新的文件名会更好)
答案 1 :(得分:0)
Spark 已经在名称中写入带有 UUID 的文件。您可以设置客户文件命名(例如添加一些 id),而不是创建太多分区。可能这是适合您的解决方案 - https://stackoverflow.com/a/43377574/1251549
尚未尝试(但正在计划中)-https://github.com/awslabs/amazon-s3-tagging-spark-util 理论上,你可以用jobid(或其他)标记然后运行一些东西
这两种解决方案都会导致执行多个 s3 list objects
API 请求检查标签/文件名并一一删除文件。