我有拼花数据存储在S3和Athena表上,按id和日期分区。拼花文件存储在
s3://bucket_name/table_name/id=x/date=y/
parque文件包含其中的分区列(id
,date
),因此我无法使用AWSGlue读取它们。
我只想读取几个分区中的数据,因此我使用分区谓词如下:
today = date.today()
yesterday = today - timedelta(days = 1)
predicate = "date = date '" + str(yesterday) +"'"
df =glueContext.create_dynamic_frame_from_catalog(database_name, table_name, push_down_predicate= predicate)
但是,由于文件已经包含分区列,我收到以下错误:
分析异常:在数据架构和分区架构中发现重复列:id
,date
有没有一种方法可以从这样的几个分区中读取数据?我可以通过忽略id
和date
列来以某种方式读取数据吗?
任何形式的帮助是赞赏:)
关于您的第一个问题“有没有办法我只能从这样的几个分区读取数据?”:
在我看来,你不需要使用谓词——分区拼花文件的美妙之处在于,火花将把沿着这些分区应用的任何过滤器推到文件扫描阶段。这意味着火花能够通过读取拼花文件的元数据来跳过某些组。
在执行df=spark.read()
和df. filter(co("date") == '2022-07-19')
后,请查看物理执行计划。
你应该找到一些类似的东西
+- FileScan parquet [idxx, ... PushedFilters: [IsNotNull(date), EqualTo(date, 2022-07-19)..
关于您是否可以通过忽略id和date列来读取数据:您可以在底层为read函数添加多个parque路径-这将忽略日期/id列(我不知道为什么您会这样做,尽管如果您需要过滤它们):
df = spark.read.parquet(
"file:///your/path/date=2022-07-19/id=55/",
"file:///your/path/date=2022-07-19/id=40/")
# Shorter solution:
df = spark.read.parquet(
"file:///your/path/date=2022-07-19/id={55, 40}/*")