【问题标题】:PySpark: how to read in partitioning columns when reading parquetPySpark:读取镶木地板时如何读取分区列
【发布时间】:2018-11-28 09:17:48
【问题描述】:

我将数据存储在 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)

但是,我的数据不包括有关 year, month and day 的信息,因为这不是数据本身的一部分,而是存储在文件的路径中。

我可以使用 sql 上下文和带有一些 select 语句的 send hive 查询,其中包含年、月和日列的位置,以仅从我感兴趣的分区中选择数据。但是,我宁愿避免在 python 中构造 SQL 查询因为我很懒,不喜欢读SQL。

我有两个问题:

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

【问题讨论】:

  • 嗨,您是否查看过为每个文件添加一个带有函数input_file_name() 的文件名的附加列,例如:stackoverflow.com/questions/39868263/… 那么您的路径应该包括在内。您甚至可以去掉部分路径,例如使用正则表达式的月、日
  • 是的,我试过了,但是解析年月日似乎有点慢
  • 我认为您可以添加基本路径选项sqlContext.read.option("basePath", hdfs://data/table_name).format("parquet").load(paths_to_files),然后您将获得所需的列。这对我有用,但用法略有不同。
  • 谢谢@JoshHerzberg。添加 option("basePath",..) 对我有用:)

标签: apache-spark hadoop pyspark apache-spark-sql parquet


【解决方案1】:

读取年份分区的父目录的直接文件路径应该足以让数据框确定其下有分区。但是,例如,如果没有目录结构/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() 

【讨论】:

  • 不幸的是,当我尝试读取 year 分区的父目录的路径时,我收到 unable to determine the parquet schema 错误。还没有找到解决办法。非常感谢不写sql查询处理的建议。
  • 您能否提供一些详细信息,说明为什么完全通过 Metastore 会更好?
  • Hive Metastore 知道文件存在的位置并自动确定 parquet 文件的列和元数据
  • 非常感谢!是否也可以使用数据框 api 写入表? (我有外部蜂巢表,存储为镶木地板,由一列分区)
  • df.saveAsTable,我相信
【解决方案2】:

您的数据未以最适合镶木地板的方式存储,因此您必须逐个加载文件并添加日期

或者,您可以将文件移动到适合 parquet 的目录结构 (例如 .../table/year=2018/month=10/day=29/file.parquet) 然后您可以读取父目录(表)并过滤年、月和日(并且 spark 只会读取相关目录),您也可以将这些作为属性获取到数据框中

【讨论】:

    猜你喜欢
    • 2018-11-14
    • 2022-06-16
    • 2021-03-19
    • 2018-08-13
    • 2018-11-22
    • 2021-11-10
    • 2020-03-14
    • 2017-12-27
    • 2017-08-16
    相关资源
    最近更新 更多