gpt4 book ai didi

apache-spark - PySpark:如何在读取 Parquet 时读取分区列

转载 作者:可可西里 更新时间:2023-11-01 16:35:39 29 4
gpt4 key购买 nike

我将数据存储在 Parquet 文件和按年、月、日分区的配置单元表中。因此,每个 parquet 文件都存储在 /table_name/year/month/day/ 文件夹中。

我只想读入部分分区的数据。我有如下各个分区的路径列表:

paths_to_files = ['hdfs://data/table_name/2018/10/29',
'hdfs://data/table_name/2018/10/30']

然后尝试做类似的事情:

df = sqlContext.read.format("parquet").load(paths_to_files)

但是,我的数据不包含关于年月日的信息,因为这不是数据本身的一部分,而是信息存储在文件的路径中。

我可以使用 sql 上下文和发送配置单元查询以及一些带有年、月和日列上 where 的选择语句来仅从我感兴趣的分区中选择数据。但是,我宁愿避免在 python 中构建 SQL 查询因为我很懒,不喜欢读 SQL。

我有两个问题:

  1. 读取存储为 parquet 的数据的最佳方式(性能方面)是什么,其中有关年、月、日的信息不存在于 parquet 文件中,但仅包含在文件路径中? (使用 sqlContext.sql('...') 发送配置单元查询,或使用 read.parquet,...任何东西。
  2. 在使用 我上面概述的方法?

最佳答案

读取到年份分区父目录的直接文件路径应该足以让数据框确定其下有分区。但是,如果没有目录结构 /year=2018/month=10,它将不知道如何命名分区。

因此,如果你有 Hive,那么通过 Metastore 会更好,因为分区在那里命名,Hive 存储关于你的表的额外有用信息,然后你不依赖于知道文件的直接路径来自 Spark 代码的磁盘。

虽然不确定您为什么认为需要读/写 SQL。

改为使用 Dataframe API,例如

df = spark.table("table_name")
df_2018 = df.filter(df['year'] == 2018)
df_2018.show()

关于apache-spark - PySpark:如何在读取 Parquet 时读取分区列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53515926/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com