PySpark:如何在读取镶木地板时读取分区列
PySpark: how to read in partitioning columns when reading parquet
我将数据存储在 parquet 文件和按年、月、日分区的配置单元 table 中。因此,每个镶木地板文件都存储在 /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 语句的发送配置单元查询,其中年、月和日列的位置 select 只有来自我感兴趣的分区的数据in. 但是,我宁愿避免在 python 中构建 SQL 查询,因为我很懒惰,不喜欢阅读 SQL.
我有两个问题:
- 读取存储为 parquet 的数据的最佳方式(性能方面)是什么,其中有关年、月、日的信息不存在于 parquet 文件中,但仅包含在文件路径中? (要么使用
sqlContext.sql('...')
发送配置单元查询,要么使用 read.parquet
,...任何东西。
- 我可以在使用时以某种方式提取分区列吗
我上面概述的方法?
读取年份分区父目录的直接文件路径应该足以让数据框确定其下有分区。但是,如果没有目录结构 /year=2018/month=10
,它将不知道如何命名分区。
因此,如果您有 Hive,那么通过 Metastore 会更好,因为分区在那里命名,Hive 存储关于您的 table 的额外有用信息,然后您就不必依赖了解从 Spark 代码到磁盘上文件的直接路径。
但不确定您认为需要 read/write SQL 的原因。
改用数据框API,例如
df = spark.table("table_name")
df_2018 = df.filter(df['year'] == 2018)
df_2018.show()
您的数据未以最适合 parquet 的方式存储,因此您必须一个接一个地加载文件并添加日期
或者,您可以将文件移动到适合 parquet 的目录结构
(例如.../table/year=2018/月=10/日=29/file.parquet)
然后您可以读取父目录 (table) 并按年、月和日进行过滤(并且 spark 将只读取相关目录),您还将在数据框中将这些作为属性获取
我将数据存储在 parquet 文件和按年、月、日分区的配置单元 table 中。因此,每个镶木地板文件都存储在 /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 语句的发送配置单元查询,其中年、月和日列的位置 select 只有来自我感兴趣的分区的数据in. 但是,我宁愿避免在 python 中构建 SQL 查询,因为我很懒惰,不喜欢阅读 SQL.
我有两个问题:
- 读取存储为 parquet 的数据的最佳方式(性能方面)是什么,其中有关年、月、日的信息不存在于 parquet 文件中,但仅包含在文件路径中? (要么使用
sqlContext.sql('...')
发送配置单元查询,要么使用read.parquet
,...任何东西。 - 我可以在使用时以某种方式提取分区列吗 我上面概述的方法?
读取年份分区父目录的直接文件路径应该足以让数据框确定其下有分区。但是,如果没有目录结构 /year=2018/month=10
,它将不知道如何命名分区。
因此,如果您有 Hive,那么通过 Metastore 会更好,因为分区在那里命名,Hive 存储关于您的 table 的额外有用信息,然后您就不必依赖了解从 Spark 代码到磁盘上文件的直接路径。
但不确定您认为需要 read/write SQL 的原因。
改用数据框API,例如
df = spark.table("table_name")
df_2018 = df.filter(df['year'] == 2018)
df_2018.show()
您的数据未以最适合 parquet 的方式存储,因此您必须一个接一个地加载文件并添加日期
或者,您可以将文件移动到适合 parquet 的目录结构 (例如.../table/year=2018/月=10/日=29/file.parquet) 然后您可以读取父目录 (table) 并按年、月和日进行过滤(并且 spark 将只读取相关目录),您还将在数据框中将这些作为属性获取