问题解决: Spark无法读取有多个子目录的Parquet表

当使用Tez处理数据并用union all整合时,会产生多个子目录导致Spark无法读取。解决方法包括避免最后一步使用union all,或者通过配置使Spark采用Hive的数据解析方式来读取子目录中的Parquet表。

问题解决: Spark无法读取有多个子目录的Parquet表

用tez做数据处理时,免不了要用union all来整合多个数据源的数据。但是如果最后一步是union all的话,就会生成多个子目录,这时用Spark就可能无法读取到子目录中的内容(取决于spark的配置)。

这个问题的原因是tez的union all是并行去做的,为了避免文件的冲突,tez写到了多个子目录里面。解决这个问题有两个方向,一个是不生成子目录,一个是修改spark的配置。

不生成子目录, 只要最后一步不是union all就好了

1、再sql最后面增加distribute by, 强制触发一次reduce过程
2、union all插表结束之后,再做一次自表插入(insert overwrite self select from self)
3、不用union all,而是insert overwrite一次,然后insert一次。

参考文档: https://grokbase.com/t/hive/user/158kd4k645/tez-anyway-to-avoid-creating-subdirectories-by-insert-with-union-all
在这里插入图片描述

### 在 Spark SQL 中执行 SQL 查询时产生个 Job 的原因 在 Spark SQL 中,一个 SQL 查询被拆分成个 Job 是由 Spark 的分布式计算模型和查询优化器的特性决定的。以下是详细的原因和影响因素: #### 1. 数据分区与并行计算 Spark 的核心理念是将数据划分为个分区,并通过并行计算来提高效率。当执行 SQL 查询时,Spark SQL 会根据数据的分区情况以及操作的性质,将任务分解为个阶段(Stage),每个阶段可能对应一个或个 Job。这种划分确保了计算资源的有效利用[^4]。 #### 2. Shuffle 操作导致的 Stage 划分 Shuffle 是 Spark 中一种昂贵的操作,它会将数据重新分布到不同的分区中。每当发生 Shuffle 操作时,Spark 会将当前的任务划分为一个新的 Stage,而每个 Stage 通常对应一个或个 Job。例如,在执行 `GROUP BY` 或 `JOIN` 等需要重新分区的操作时,会产生新的 Stage 和相应的 Job[^3]。 #### 3. Catalyst 查询优化器的作用 Spark SQL 使用 Catalyst 查询优化器对 SQL 查询进行逻辑和物理优化。Catalyst 会将 SQL 查询转换为逻辑计划,然后进一步优化为物理计划。在这个过程中,某些复杂查询可能会被拆分为个子查询,从而导致个 Job 的生成。例如,复杂的联结或嵌套查询可能会触发个 Stage 和 Job 的执行[^1]。 #### 4. 动态分区裁剪与广播优化 在某些情况下,Spark SQL 会应用动态分区裁剪或广播优化技术来提高查询性能。这些优化策略可能会导致额外的 Job 被创建。例如,当使用广播连接时,Spark 可能会先启动一个 Job 来广播小,然后再启动另一个 Job 来处理大的分区数据[^2]。 #### 5. 数据源与外部存储交互 如果 SQL 查询涉及从外部数据源(如 HiveParquet、JSON 等)读取数据,Spark SQL 可能会生成额外的 Job 来完成数据加载和预处理。例如,读取 Parquet 文件时,Spark 可能会先启动一个 Job 来解析文件元数据,然后再启动另一个 Job 来实际读取数据[^3]。 #### 示例代码:SQL 查询拆分为个 Job 以下是一个简单的 SQL 查询示例,展示如何触发个 Job: ```sql -- 创建临时视图 CREATE OR REPLACE TEMP VIEW data AS SELECT * FROM parquet.`path/to/data`; -- 执行复杂查询 SELECT a.id, COUNT(b.value) FROM data a LEFT JOIN data b ON a.id = b.id GROUP BY a.id; ``` 上述查询可能涉及以下步骤: 1. 读取 Parquet 文件元数据(Job 1)。 2. 广播小数据(Job 2)。 3. 执行联结和聚合操作(Job 3)。 #### 影响因素总结 - **Shuffle 操作**:每次 Shuffle 都会导致新的 Stage 和 Job 的生成。 - **查询复杂度**:复杂的 SQL 查询可能被拆分为个子查询,从而产生个 Job。 - **数据源类型**:不同的数据源可能需要额外的 Job 来完成数据加载和预处理。 - **优化策略**:动态分区裁剪、广播连接等优化策略可能触发额外的 Job。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值