使用Spark SQL在Hive分区中的子目录中查询数据

时间:2017-02-15 12:48:59

标签: apache-spark hive apache-spark-sql parquet

如何强制spark sql以递归方式从子目录中获取以镶木地板格式存储的数据?在Hive中,我可以通过设置几个Hive配置来实现这一点。

set hive.input.dir.recursive=true;
set hive.mapred.supports.subdirectories=true;
set hive.supports.subdirectories=true;
set mapred.input.dir.recursive=true;

我尝试通过spark sql查询设置这些配置但是我总是得到0条记录,而hive则得到了预期的结果。我也把这些confs放在hive-site.xml文件中,但没有任何改变。我该如何处理这个问题?

Spark版本:2.1.0 我在emr-5.3.1上使用了Hive 2.1.1

顺便说一句,这个问题在使用镶木地板文件时出现,而使用JSON则可以正常工作。

2 个答案:

答案 0 :(得分:1)

这个问题的一个解决方案是通过使用hive上下文强制Spark到Hive Parquet阅读器,这会使spark能够递归地读取文件。

答案 1 :(得分:0)

在Spark 2.3中,您只需加载顶级目录,Spark就会自动递归到较低目录。例如,在HDFS上,我有:

drwxr-xr-x   - impala hive          0 2019-08-12 12:36 /user/hive/warehouse/prd.db/schedules/departure_year=2009
drwxr-xr-x   - impala hive          0 2019-08-12 12:36 /user/hive/warehouse/prd.db/schedules/departure_year=2010
drwxr-xr-x   - impala hive          0 2019-08-12 12:36 /user/hive/warehouse/prd.db/schedules/departure_year=2011
drwxr-xr-x   - impala hive          0 2019-08-12 12:36 /user/hive/warehouse/prd.db/schedules/departure_year=2012

以此类推。我可以使用

来阅读
spark.read.parquet("hdfs://name.node.server:8020/user/hive/warehouse/prd.db/schedules")

结果DataFrame将具有与目录名称相对应的列departure_year