【问题标题】:Query data in subdirectories in Hive Partitions using Spark SQL使用 Spark SQL 查询 Hive 分区中子目录中的数据
【发布时间】:2017-07-04 03:27:17
【问题描述】:

如何强制 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 查询设置这些配置,但与 hive 相比,我总是得到 0 条记录,这让我得到了预期的结果。我还将这些配置文件放在 hive-site.xml 文件中,但没有任何改变。我该如何处理这个问题?

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

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

【问题讨论】:

  • 我正在尝试自己找出这个问题的答案。
  • @IceMan 我现在发布了答案,希望对您有所帮助

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


【解决方案1】:

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

【讨论】:

  • 我对 Parquet 数据和一些我想忽略的子分区有同样的问题,请问您有更多关于您的解决方案的详细信息吗?我使用从 STS 或 Livy 运行的 Spark SQL,创建这样的 Hive 表: CREATE TABLE xxx.yyy (...) STORED AS PARQUET LOCATION 's3://bucket/path/' TBLPROPERTIES('mapred.input. dir.recursive'='true', 'hive.supports.subdirectories'='true', 'hive.mapred.supports.subdirectories'='true', 'hive.input.dir.recursive'='true') 分区BY (年份 int, 月份 int , day int);然后我运行'msck repair table xxx.yyy;'但我查询时没有看到数据
【解决方案2】:

在 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 对应于目录名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 2016-12-04
    • 2020-04-12
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    相关资源
    最近更新 更多