【发布时间】: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。
我有两个问题:
- 什么是读取存储为 parquet 的数据的最佳方式(性能方面),其中有关年、月、日的信息不存在于 parquet 文件中,而仅包含在文件的路径中? (使用
sqlContext.sql('...')发送蜂巢查询,或者使用read.parquet,...任何东西。 - 在使用 我上面概述的方法?
【问题讨论】:
-
嗨,您是否查看过为每个文件添加一个带有函数
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