使用 Spark 查询 Hive 分区中子目录中的数据 SQL
Query data in subdirectories in Hive Partitions using Spark SQL
如何强制 spark sql 从子目录中递归获取以 parquet 格式存储的数据?在 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 条记录。我还将这些 confs 放在 hive-site.xml 文件中,但没有任何改变。我该如何处理这个问题?
星火版本:2.1.0
我在 emr-5.3.1
上使用了 Hive 2.1.1
顺便说一下,这个问题在使用 parquet 文件时出现,而 JSON 它工作正常。
此问题的一个解决方案是通过使用 hive 上下文将 spark 强制到 Hive Parquet reader,这将使 spark 能够递归读取文件。
在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
对应于目录名称。
如何强制 spark sql 从子目录中递归获取以 parquet 格式存储的数据?在 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 条记录。我还将这些 confs 放在 hive-site.xml 文件中,但没有任何改变。我该如何处理这个问题?
星火版本:2.1.0 我在 emr-5.3.1
上使用了 Hive 2.1.1顺便说一下,这个问题在使用 parquet 文件时出现,而 JSON 它工作正常。
此问题的一个解决方案是通过使用 hive 上下文将 spark 强制到 Hive Parquet reader,这将使 spark 能够递归读取文件。
在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
对应于目录名称。