提问者:小点点

从分区Parquet数据读取Spark Dataframe


我有拼花数据存储在S3和Athena表上,按id和日期分区。拼花文件存储在

 s3://bucket_name/table_name/id=x/date=y/

parque文件包含其中的分区列(iddate),因此我无法使用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)

但是,由于文件已经包含分区列,我收到以下错误:

分析异常:在数据架构和分区架构中发现重复列:iddate

有没有一种方法可以从这样的几个分区中读取数据?我可以通过忽略iddate列来以某种方式读取数据吗?

任何形式的帮助是赞赏:)


共1个答案

匿名用户

关于您的第一个问题“有没有办法我只能从这样的几个分区读取数据?”:

在我看来,你不需要使用谓词——分区拼花文件的美妙之处在于,火花将把沿着这些分区应用的任何过滤器推到文件扫描阶段。这意味着火花能够通过读取拼花文件的元数据来跳过某些组。

在执行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}/*")