我有一些数据存储在parquet文件和hive表中,按年、月、日进行分区。因此,每个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上下文和hive查询,并使用某些select语句来选择只从我感兴趣的分区中选择数据。然而,我宁愿避免在Python中构建SQL查询,因为我非常懒,不喜欢阅读SQL。
我的两个问题是:
1. 以性能为优化目标的最佳数据读取方式是什么?其中,关于年、月和日的信息不存在于parquet文件中,但是只包含在文件路径中(使用
sqlContext.sql('...')
发送hive查询,或使用read.parquet
等任何方法)。
2. 当使用我上述的方法时,是否可以提取分区列的信息?
input_file_name()
为每个文件添加一个附加的列,其中包含文件名,类似于以下链接中的示例:https://dev59.com/qVkS5IYBdhLWcg3wb2Ts 这样你的路径就会被包含在内。你甚至可以使用正则表达式剥离路径的某些部分,例如月份、日期。 - gawbasepath
选项sqlContext.read.option("basePath", hdfs://data/table_name).format("parquet").load(paths_to_files)
,然后你就能得到你想要的列。这是在稍微不同的用法中对我有效的方法。 - Josh Herzberg